我必须为大学编写一个小的 c 程序,它应该在命令行上再次打印给定的参数。任务是用指针来完成。 所以我的问题是,当未使用的变量“bin”是代码的一部分时,程序完全正确。但是,如果我尝试删除代码或将其注释掉,程序将不再运行(它崩溃或不打印任何内容)...但是程序中根本没有使用该变量。我也可以更改它的名称,但不能更改它的声明值。也许有人可以帮助/解释问题所在:) 谢谢!
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
char *text;
char bin = '\0'; //<---- unused variable
char space = 32;
int i = 0;
if(argc == 1){
printf("Bitte Parameter mit angeben!");
return 1;
}
text = malloc(sizeof(char));
for(i = 1; i < argc; i++){
text = realloc(text, sizeof(char) * (strlen(argv[i]) + 2 +
strlen(text)));
if(text == NULL)
return 1;
text = strcat(text, argv[i]);
text = strcat(text, &space);
}
text++;
printf("%s", text);
free(text);
return 0;
}
最佳答案
您的代码连接到 text
而不初始化 text
。您需要以 text
作为空字符串开始:
text = malloc(sizeof(char));
text[0] = `\0` ; // empty string
然后将 &space
传递给 strcat()
是错误的,因为 space
不是以 nul 结尾的字符串。只需替换为:
text = strcat(text, " " ) ;
然后稍后删除 text++
否则它会省略第一个字符,并且您不能 free()
修改后的指针而不会导致堆错误:
// text++; <<< NOT NEEDED and makes free(text) bound to fail.
printf("%s", text);
free( text ) ;
为什么它与 bin
present 一起工作是因为你很幸运,并且由于堆栈上的邻接,它恰好形成了 &space
的 nul 终止符。您再次幸运地看到任何未初始化的 text
指向的内容,并且释放修改后的指针可能不会导致错误或故障,因为程序结束时没有尝试分配任何进一步的内存。
关于c - 未使用的变量影响程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066397/