Malloc试图解决0x0?

时间:2016-11-27 04:27:39

标签: c segmentation-fault

我正在使用C中的动态内存。我正在编写一个应该

的小函数
  1. 取一个字符串(char *)作为参数;
  2. 为该字符串分配带malloc的内存,将其复制到内存中;和
  3. 返回新分配的字符串。
  4. 我的程序会出现分段错误。

    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的一些见解?我看不到它。

3 个答案:

答案 0 :(得分:2)

#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。这意味着line为NULL。调用new_line的代码传递空指针。

int line_len = strlen(line)+1;

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

答案 1 :(得分:1)

printf在内部使用strlen

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

printf

之后移动strncpy

答案 2 :(得分:1)

存在以下问题。

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

    char *new_line(char *line) {
            char *temp_line = 0;
    
            if(0 == line)
            {
                printf("Input is null\n");
                return 0
            }
    
            int line_len = strlen(line)+1;
            temp_line = malloc(line_len * sizeof(char));
            if(0 == temp_line)
            {
                printf("Failed to allocate memory for new string\n");
                return 0;
            }
    
            strncpy(temp_line,line,line_len);
            temp_line[line_len-1] = '\0';
            /* You can replace above two lines with strcpy(). */
    
            printf("Inp string[%s] new string[%s]\n", line, temp_line);
    
            return temp_line;
    }