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

使char指针指向null会导致分段错误,c,linux,segmentation-fault,C,Linux,Segmentation Fault,在linux中,我正在尝试以下导致分段错误的代码: int main(int arg_count,char *args[]){ char *buffer; if(arg_count>1) buffer = args[1]; else *buffer = 0; } 我知道指针指向内存的只读部分,所以我将first try buffer[0]=0;到上面。但我不明白为什么这个也不行 函数的最后一行*buffer=0试图设置指针缓冲区引用

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

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

我知道指针指向内存的只读部分,所以我将first try buffer[0]=0;到上面。但我不明白为什么这个也不行

函数的最后一行*buffer=0试图设置指针缓冲区引用的值

由于缓冲区从未初始化,因此包含一个不确定的值,取消对缓冲区的引用很可能会导致segfault


对于大多数项目,您永远不应该自己编写参数解析代码。有许多健壮而高效的库,它们将比您或我做得更好。在Linux上编写C是一个不错的选择。

函数的最后一行*buffer=0试图设置指针缓冲区引用的值

由于缓冲区从未初始化,因此包含一个不确定的值,取消对缓冲区的引用很可能会导致segfault


对于大多数项目,您永远不应该自己编写参数解析代码。有许多健壮而高效的库,它们将比您或我做得更好。在Linux上编写C是一个不错的选择。

如果逐行检查程序,您会发现如果用户不传递任何参数,则缓冲区只是一个随机值。正如另一条评论所说,您需要初始化它。在您的情况下,我认为您实际上不希望将值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只是一个随机值。正如另一条评论所说,您需要初始化它。在您的情况下,我认为您实际上不希望将值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字节并将缓冲区指向该内存位置,然后请求用户输入。从这一点上,您可以对缓冲区执行任何您想要的操作。

缓冲区字符指针未初始化。因为缓冲区是用自动存储类声明的,所以它将有一个垃圾值。您正试图访问一个未初始化的指针,该指针是内存访问异常,因此它出现seg错误。在访问缓冲区之前,使用calloc或malloc分配内存

缓冲区字符指针未初始化。因为缓冲区是用自动存储类声明的,所以它将有一个垃圾值。您正试图访问一个未初始化的指针,该指针是内存访问异常,因此它出现seg错误。在访问缓冲区之前,使用calloc或malloc分配内存

您不能将空指针取消引用到任何有意义的内容中。@IgnacioVazquez Abrams:哪个空指针?@alk我相信他指的是未初始化的指针=>char*buffer;您不能将空指针取消引用到任何有意义的内容中。@IgnacioVazquez Abrams:哪个空指针?@alk我相信他指的是未初始化的指针=>char*buffer;非常感谢。因此,为了解决这个问题,我是否应该将其初始化为空?例如,工程师可能应该将其初始化为空,但更重要的是:您永远不应该取消对未初始化指针的引用。空指针BTW.buffer=0或buffer=NULL都是有意义的。但是,您必须确保不会在程序的其他地方取消对它们的引用。谢谢。因此,为了解决这个问题,我是否应该将其初始化为空?例如,工程师可能应该将其初始化为空,但更重要的是:您永远不应该取消对未初始化指针的引用。空指针BTW.buffer=0或buffer=NULL都是有意义的。但是,您必须确保不会在程序的其他地方取消引用它们。