Malloc是否尝试寻址0x0?

Malloc是否尝试寻址0x0?,c,segmentation-fault,C,Segmentation Fault,我正在用C语言处理动态内存。我正在编写一个小函数,它应该 以字符串(char*)作为参数 使用malloc为该字符串分配内存,并将其复制到内存中;及 返回新分配的字符串 我的程序出现了一个分段错误 char *new_line(char *line) { char *temp_line; int line_len = strlen(line)+1; temp_line = malloc(line_len * sizeof(char));

我正在用C语言处理动态内存。我正在编写一个小函数,它应该

  • 以字符串(char*)作为参数
  • 使用malloc为该字符串分配内存,并将其复制到内存中;及
  • 返回新分配的字符串
  • 我的程序出现了一个分段错误

    char *new_line(char *line) {
            char *temp_line;
            int line_len = strlen(line)+1;
            temp_line = malloc(line_len * sizeof(char));
            printf(temp_line);
            strncpy(temp_line,line,line_len);
            return temp_line;
    }
    
    根据GDB,我的程序在这个函数上失败了,因为它显然试图对地址0x0做些什么(?)。 GDB是这么说的:

    #0  0x00007ffff7b7c3c1 in __strlen_sse2_pminub () from /lib64/libc.so.6
    #1  0x00000000004008fc in new_line (line=0x0) at myfile.c:35
    

    根据我的函数,有人能提供一些关于为什么malloc似乎返回或处理0x0的见解吗?我看不见。

    printf
    在内部使用
    strlen

    您在
    malloc
    的缓冲区上调用
    printf
    ,该缓冲区中[可能]包含随机字符[它不会初始化字节]。因此,
    strlen
    可能只是“继续”


    printf
    移动到
    strncpy

    printf
    内部使用
    strlen
    之后

    #0  0x00007ffff7b7c3c1 in __strlen_sse2_pminub () from /lib64/libc.so.6
    
    您在
    malloc
    的缓冲区上调用
    printf
    ,该缓冲区中[可能]包含随机字符[它不会初始化字节]。因此,
    strlen
    可能只是“继续”

    printf
    移动到
    strncpy

    #0  0x00007ffff7b7c3c1 in __strlen_sse2_pminub () from /lib64/libc.so.6
    
    崩溃的是strlen,而不是malloc

    #1  0x00000000004008fc in new_line (line=0x0) at myfile.c:35
    
    注意,上面写着
    line=0x0
    。这意味着
    为空。调用
    new\u line
    的代码正在传递一个空指针

    int line_len = strlen(line)+1;
    
    这反过来会导致
    strlen
    被赋予一个空指针

    int line_len = strlen(line)+1;
    
    崩溃的是strlen,而不是malloc

    #1  0x00000000004008fc in new_line (line=0x0) at myfile.c:35
    
    注意,上面写着
    line=0x0
    。这意味着
    为空。调用
    new\u line
    的代码正在传递一个空指针

    int line_len = strlen(line)+1;
    

    这反过来会导致strlen被赋予一个空指针。

    存在以下问题

    int line_len = strlen(line)+1;
    
  • 主要问题是,在将数据复制到新字符串之前,要先打印新字符串。分配的内存将有一些随机数据
  • 最好检查内存分配是否成功。还要检查输入指针
  • strncpy()
    不会将
    '\0'
    放在末尾。你需要明确地说出来。因为在这种情况下,您已经通过检查输入字符串的大小来分配内存,所以可以调用
    strcpy()


  • 有以下问题

  • 主要问题是,在将数据复制到新字符串之前,要先打印新字符串。分配的内存将有一些随机数据
  • 最好检查内存分配是否成功。还要检查输入指针
  • strncpy()
    不会将
    '\0'
    放在末尾。你需要明确地说出来。因为在这种情况下,您已经通过检查输入字符串的大小来分配内存,所以可以调用
    strcpy()


  • 请发一封信,嗯?堆栈跟踪向我显示strlen not malloc正在寻址0x0。错误消息显示
    (line=0x0)
    ,这意味着您向函数传递了
    NULL
    指针。您是否将NULL指针(0x0)或有效字符串传递到
    new_line()
    ?您可以使用strdup来完成此操作(尽管不是很方便).请发个帖子,嗯?堆栈跟踪向我显示strlen not malloc正在寻址0x0。错误消息显示
    (line=0x0)
    ,这意味着您向函数传递了
    NULL
    指针。您是否将NULL指针(0x0)或有效字符串传递到
    new_line()
    ?您可以使用strdup来完成此操作(尽管不是很方便)。