int main(int arg_count,char *args[]){
char *buffer;
if(arg_count>1)
buffer = args[1];
else
*buffer = 0;
}
我知道指针指向只读取部分内存,所以我将第一次尝试buffer[0]=0;
改为上面。但我不明白为什么这个也不起作用?!
答案 0 :(得分:6)
函数的最后一行*buffer = 0
正在尝试设置指针buffer
引用的值。
由于buffer
从未初始化,因此包含和不确定的值,因此解除引用buffer
很可能会导致段错误。
对于大多数项目,您不应该自己编写参数解析代码。有许多强大而高效的库可以比你(或我)做得更好。正如您在Linux上编写C GNU getopt是一个不错的选择。
答案 1 :(得分:1)
如果你逐行浏览你的程序,你会发现如果用户没有传递任何参数,那么缓冲区只是一个随机值。正如另一条评论所说,你需要初始化它。在你的情况下,我不认为你真的想要将值0
放在缓冲区指向的内存地址中。这是代码,显示如何处理参数
int main(int argc, char **argv){
char *buffer = NULL;
if(argc > 1){
buffer = argv[1];
}
else{
buffer = malloc(1024);
puts("please enter an argument");
fgets(buffer, 1024, stdin);
//do stuff with buffer
free(buffer)
}
return 0;
}
程序上面的代码中的检查是否有任何参数传递给程序,如果没有传递参数,则程序分配1024个字节并将缓冲区缓冲到该内存位置,然后要求用户输入。从这一点开始,您可以使用缓冲区执行任何操作。
答案 2 :(得分:0)
buffer
字符指针未初始化。由于buffer
是使用自动存储类声明的,因此它将具有垃圾值。您正在尝试访问未初始化的指针,这是一个内存访问异常,因此它给出了一个seg错误。在访问buffer
之前使用calloc或malloc分配内存。