繁体   English   中英

strcpy之后C程序崩溃

[英]C program crashes after strcpy

我已经尝试解决此问题,但最终还是一无所获,希望您能向我提示正确的方向。 我有一个程序,我以这种方式初始化了一个char数组:

char variable1[8];

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

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

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

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

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

我在这里阅读了strcpy函数

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

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

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

奇怪的是,我可以执行function1(),该函数返回一个没有问题的值。 只有当我尝试将其复制时,程序才会崩溃。 有什么想法我下一步应该做什么?

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

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

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

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

并记得之后释放指针。

问题在于char值不是char* ,并且强制转换它不是这样做的(这只会使编译器停止抱怨)。 因此程序崩溃,因为它试图取消引用无效的指针。

尝试:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM