2016-11-27 29 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; 
    }