在Linux中,我正在尝试以下导致分段错误错误的代码:
int main(int arg_count,char *args[]){
char *buffer;
if(arg_count>1)
buffer = args[1];
else
*buffer = 0;
}
我知道指针只指向读取部分内存,所以我将我的第一次尝试buffer[0]=0;
更改为上面。但我也不明白为什么这个也不起作用?!
函数的最后一行*buffer = 0
尝试设置指针buffer
引用的值。
由于buffer
从未初始化过,因此包含不确定的值,因此取消引用buffer
很可能导致段错误。
对于大多数项目,您永远不应该自己编写参数解析代码。有许多强大而高效的库会比你(或我(做得更好。当你在Linux上写C时,GNU是一个不错的选择。
如果你逐行浏览程序,你会看到如果用户不传递任何参数,那么缓冲区只是一个随机值。正如另一条评论所说,您需要初始化它。在您的情况下,我认为您不想将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 字节和点缓冲区分配给该内存位置,然后要求用户输入。从这一点开始,您可以使用缓冲区做任何您想做的事情。
buffer
字符指针未初始化。由于buffer
是用自动存储类声明的,因此它将具有垃圾值。您正在尝试访问一个未初始化的指针,这是一个内存访问异常,因此它给出了一个 seg 错误。在访问buffer
之前,请使用 calloc 或 malloc 分配内存。