2015-12-05 158 views
1

這段代碼運行時出現了段錯誤,但編譯沒有問題。哪裏不對?指針結構的問題

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    char *fld[129]; 
} isomsg; 

void iso8583_init(isomsg *m) 
{ 
    int i; 

    for (i = 0; i <= 128; i++) { 
     m->fld[i] = NULL; 
    } 
} 


isomsg m; 

int main(int argc, char *argv[]) { 

    iso8583_init(&m); 

    strcpy(m.fld[0],"Fisrt"); 

    printf("First = %s\n",m.fld[0]); 

    system("PAUSE"); 
    return 0; 
} 

回答

2

有問題的行是:

strcpy(m.fld[0],"Fisrt"); 

m.fld[0]是初始化爲NULL指針。如果地址指向NULL,則不能寫入地址。這是undefined behaviour

你可能想:

m.fld[0] = "Fisrt"; 

這將字符串字面指針m.fld[0]的地址。

或者,如果你想使字符串拷貝文字"First"那麼你可以使用strdup()(POSIX):

m.fld[0] = strdup("Fisrt"); 

或者使用malloc() + strcpy()(標準C):

m.fld[0] = malloc(sizeof("First")); //allocate memory of 6 bytes 
strcpy(m.fld[0], "First"); 

(您應該檢查strdup/malloc()是否因爲失敗而返回NULL。)

+0

非常感謝;這解決了我的問題 – user5240895

+0

如果我使用:memcpy(&m.fld [0],「First」,5); – user5240895

+0

@ user5240895 memcpy()是另一種複製方式。但是在任何情況下,您都需要將指針指向有效的內存位置,即您仍然需要對傳遞給memcpy()的指針執行malloc()。 –