使char指针指向null会导致分段错误

时间:2018-05-09 04:37:32

标签: c linux segmentation-fault

在linux中,我正在尝试下面的代码导致分段错误错误:

int main(int arg_count,char *args[]){  
    char *buffer;
    if(arg_count>1)
      buffer = args[1];
    else 
      *buffer = 0;
 }

我知道指针指向只读取部分内存,所以我将第一次尝试buffer[0]=0;改为上面。但我不明白为什么这个也不起作用?!

3 个答案:

答案 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分配内存。