2012-06-14 19 views
0

我想學習C,現在我玩的結構。 我有下面的代碼:Segfault雖然複製字符串

#include <string.h> 

struct user { 
    unsigned int utime; 
    char *username; 
}; 

void main() 
{ 
    char username[] = "root"; 
    struct user *u; 
    strcpy(u->username, username); 
} 

但是,當我嘗試運行它,它會產生分段故障。 它有什麼問題?

回答

3

u是一個指向結構的指針,但是您尚未爲它分配任何內存。該行必須是 struct user *u = malloc(sizeof(struct user))。此外,您還需要在調用strcpy之前爲結構中的username指針分配內存。

+1

或者只是使用一個分配'struct user'的堆棧(但是仍然需要通過動態分配存儲'username'的內存)。 – hmjd

2

在發生崩潰時(例如分段錯誤),您應該做的第一件事是在調試器中運行您的程序。它可以幫助您查明崩潰的位置,還可以查看變量以查看可能導致崩潰的原因。

然而,在你的情況下,它很簡單:

struct user *u; 
strcpy(u->username, username); 

您還沒有分配的內存爲uu->username,這意味着u可以指向任何地方在內存中,同爲u->username

0

兩件事情

你還沒有分配的結構變量「用戶結構* U;」

,你也沒有分配內存*用戶名在structore

若要

#include <string.h> 
struct user { 
unsigned int utime; 
char *username; 
}; 

void main() 
{ 
    char username[] = "root"; 
    struct user *u=malloc(sizeof(struct user)); 
    u->username=malloc(strlen(username)+1); 
    strcpy(u->username, username); 
} 

請忽略它是否有任何語法錯誤

+1

在純C中,'malloc'的返回值不一定是輸入類型。 – LihO

+0

@LihO我認爲我們應該,因爲malloc返回類型是void *。可能是你會得到警告 –

+1

當爲字符串分配內存時,它應該是'strlen(username)+ 1',所以你也得到終止''\ 0''的空間。或者使用'strdup'而不是'malloc'和'strcpy'。 –

0

另一種方法是使用u作爲一個簡單的變量:struct user u;然後訪問UTIME或用戶名,這樣「」:

u.utime = ...; 
u.username = ...; 
0

同時,你也應該知道的內存佈局,並試着推理什麼住在哪裏。 這是一個起點 - Stanford Pointers pdf 我建議,當你學習並卡住時,試着在紙上繪製流程,存儲器訪問,然後進入調試器。當我第一次學習C時,我沒有這樣做 - 內存可視化是一個讓人成爲更好的程序員/調試器的特性 - 從我從同事那裏學到的知識/在線閱讀多篇文章。