[英]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.