strcpy后C程序崩溃了

时间:2012-04-03 07:02:22

标签: c unix

我已经尝试过解决这个问题并且最终没有任何结果,我希望你能向我提示正确的方向。我有一个程序,我用这种方式初始化一个char数组:

char variable1[8];

然后我尝试复制函数的返回值,即

...
strcpy(variable1, (char *)function1());

其中function1()返回char数组值。 这是function1的结构:

 char* function1()
{
    ....
    char variable2[8]={'\0'};
    ...
    return (variable2);
}

当我尝试执行strcpy行时程序崩溃。

我已阅读strcpy函数here

  

重要说明:必须确保目标缓冲区(s1)能够包含源数组中的所有字符,包括终止空字节。否则,strcpy()将覆盖缓冲区末尾的内存,导致缓冲区溢出,这可能导致程序崩溃

因此我尝试将variable1大小增加到20,但程序仍然崩溃。

除此之外,我尝试了不同的方法,即使用strncpy函数调用,它仍然给我同样的错误。

奇怪的是我可以执行function1(),它返回一个没有问题的值。只有当我试图复制它时,我的程序崩溃了。任何想法我接下来应该做什么?

2 个答案:

答案 0 :(得分:10)

您的问题不是因为您的目标缓冲区太小,而是因为包含源字符串的变量在您尝试使用之前已超出范围。

function1内,在堆栈上创建variable2,但在退出函数时会有效地销毁它。之后尝试使用它(例如在strcpy操作中)是未定义的行为。

如果你想要一个能在函数退出后存活的数组,你可能想从堆中分配它:

char *function1 (void) {
    return calloc (1, 8);    // allocate and zero out 8 bytes
}

并记得随后释放指针。

答案 1 :(得分:1)

问题是char值不是char*,并且它不会使它成为现实(它只会让编译器停止抱怨)。因此程序崩溃是因为它试图取消引用无效指针。

尝试:

variable[0] = function1();  // store the returned character
variable[1] = 0;            // make sure there's a terminating null char