2012-04-03 128 views
1

我试过解决这个问题,只是没有结果,我希望你可以暗示我在正确的方向。我有一个程序,我初始化字符数组是这样的:C程序崩溃后strcpy

char variable1[8]; 

然后我试图复制一个函数,即

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

其中功能1()返回字符数组值的返回值。 这里是功能1的结构:

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

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

我已经阅读strcpy函数here

重要:您必须确保目标缓冲区(S1)是能够包含源阵列中的所有字符,包括终止空字节。否则,的strcpy()将覆盖存储器过去缓冲区的末尾,引起缓冲区溢出,这可能导致程序崩溃

因此,我试图增加变量1大小为20,但仍程序崩溃。

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

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

+0

了解如何使用调试器。向编译器询问它可以给你的所有警告(例如'gcc -Wall -Wextra'),然后改进你的源代码直到没有给出警告。 – 2012-04-03 07:05:53

回答

10

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

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

如果你想要一个数组,将生存函数退出,你可能想从堆中分配它:

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

,记得事后释放指针。

+0

我明白你在说什么,但函数1本身的内容增加了空终止符,即请参考上面已编辑的问题,其中我添加了function1()的内容。那么现在,这可能是什么问题? – 2012-04-03 07:22:10

+1

@ vampirus87:你已经从初始版本中改变了这个问题,所以我已经为你更新了答案。 – paxdiablo 2012-04-03 07:26:29

+0

对,是的,我意识到添加function1的内容有很大的影响,这就是为什么。换句话说,你是说这个变量超出了范围。但是在这里'strcpy(variable1,(char *)function1());'我正在使用function1()调用权,从技术上讲,它仍然适用? – 2012-04-03 07:31:39

1

问题是char的值不是char*,并且强制转换并不能实现(它只是让编译器停止抱怨)。所以程序崩溃是因为它试图取消引用无效指针。

尝试:

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