2016-11-27 31 views
0

我与动态存储器工作在C.我正在写一个小函数应Malloc试图解决0x0?

  1. 接受字符串(一个char *)作为参数;
  2. 用malloc为该字符串分配内存,将其复制到内存中;和
  3. 返回新分配的字符串。

我的程序给出一个分段错误。根据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搞乱,一些见解?我看不到它。

+0

请发表[MCVE] – CollinD

+3

咦?堆栈跟踪显示,*** strlen ***不是malloc正在寻址0x0。 – immibis

+1

错误消息显示'(line = 0x0)'这意味着您向该函数传递了一个NULL指针。 – user3386109

回答

1

printf使用strlen内部。

你调用一个缓冲printfmalloc有[可能在它随机字符[它并没有初始化字节。所以,strlen可能只是“继续前进”。

strncpy

2
#0 0x00007ffff7b7c3c1 in __strlen_sse2_pminub() from /lib64/libc.so.6 

这是strlen这都崩溃了,不malloc后移动printf

#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. 主要问题是您在将数据复制到它之前正在打印新字符串。分配的内存将有一些随机数据。
  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; 
    }