我必须为大学写一个小的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;
}
答案 0 :(得分:3)
您的代码在未初始化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
一起使用是因为你很幸运,由于堆栈上的邻接,它恰好形成了&space
的nul终结符。无论初始化时指向text
的任何内容,您再次幸运,并且自由修改指针可能不会导致错误或错误,因为程序结束时不会尝试分配任何其他内存。
答案 1 :(得分:1)
text = strcat(text, &space);
该行获取单个字符变量的地址,然后将其传递给strcat
,该bin
期望以nul结尾的字符串参数。它与const char space[] = " ";
...
text = strcat(text, space);
变量一起工作的事实可能意味着你的编译器已选择将变量放在堆栈上,使它将它视为nul-terminator;然而,依赖于此肯定是未定义的行为。
实际提供字符串文字或常量会更好,例如:
text = strcat(text, " ");
或简单地说:
text
请注意,虽然这可能会解决您的直接问题,但代码中还存在其他问题。具体来说,在初始化分配的内存之前在strlen
中使用text
并在指针移动后释放ext {
supportlib_version = '26.1.0'
gps_version = '11.2.0'
}
//Ensure that all dependencies use the same version of the Android Support library
subprojects {
project.configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'com.android.support'
&& !details.requested.name.contains('multidex')) {
details.useVersion "$supportlib_version"
}
if (details.requested.group == 'com.google.android.gms'
&& !details.requested.name.contains('multidex')) {
details.useVersion "$gps_version"
}
}
}
}
都是未定义的行为,我希望你再次幸运的是它恰好工作了现在。