2012-06-14 2 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

충돌이 발생할 때 (세그먼테이션 결함과 같은) 가장 먼저해야 할 일은 디버거에서 프로그램을 실행하는 것입니다. 충돌의 위치를 ​​정확히 알려줄 수있을뿐만 아니라 충돌을 일으킨 원인을보기 위해 변수를 조사 할 수 있습니다.

그러나, 귀하의 경우는 매우 간단합니다 u 메모리에 어디를 가리 u->username에 대해 동일 할 수 있음을 의미 u 또는 u->username에 대한

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

당신은 할당되지 않은 메모리.

0

두 가지

"struct user * u;"구조 변수에 할당하지 않은 두 가지

또한 당신이 할당되지 않은 메모리 * structore의 이름은

는 구문 오류

+1

순수한 C에서'malloc'의 반환 값은 타입 캐스트 될 필요가 없습니다. – LihO

+0

@LihO malloc 반환 유형이 void *이기 때문에 우리가해야한다고 생각합니다. –

+1

문자열을위한 메모리를 할당 할 때 그것은'strlen (username) + 1'이어야한다. 그래서 당신은'\\ '또한 끝내기위한 공간을 얻는다. 아니면'malloc'과'strcpy' 대신'strdup'을 사용하십시오. –

0

다른 방법으로 유를 사용하는 것이있는 경우

#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); 
} 

무시하십시오하려면 간단한 변수 : struct user u; 다음 UTIME 또는과 사용자 이름에 대한 액세스를, 다음과 같이 "."

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

병행하여, 당신은 또한 메모리 레이아웃에 대해 알고, 어디에 살고 어떤 추론 시도해야합니다. 시작 지점은 다음과 같습니다. - Stanford Pointers pdf 배우고 붙어있을 때 흐름과 메모리 액세스를 종이로 그린 다음 디버거로 들어가는 것이 좋습니다. 저는 C 언어를 처음 배웠을 때 이것을하지 않았습니다 - 메모리 시각화는 필자가 동료들에게서 배운 것보다 더 나은 프로그래머/디버거를 만드는 것으로 보이는 특성이지만 온라인에서 여러 기사를 읽습니다.

관련 문제