2017-10-27 10 views
0

할당 할 수 있어요 :를 strncpy 독방 감금 잘못이 있지만 캐릭터에게 나는대로 (내가 믿는 스택에?) 정의 된 배열을 숯불하는 글로벌 포인터가 수동으로

char *history[BUFFER_SIZE]; 

그리고 방법 내부 단순히 원하는을 :

strncpy(history[0], str, length); 

입니다. 그 이후로 나에게 이해가되지 않습니다.

history[0] = "a string" 

은 seg fault입니다.

내 질문 :

이 같은 문자 배열의 배열을 정의하고 있기 때문에
  1. , 내가 올바른 malloc을하거나 초기화 모든 종류의 작업을 수행 할 필요가 없습니다?
  2. 왜 오류가 발생합니까?
+0

'history [0] = "a string"은 문자열 리터럴 *에 대한 포인터입니다. 'strncpy' 또는 다른 방법으로 그것을 쓰는 것은 완전한 no-no입니다. 그러나 질문은 불분명하다. 'history [0 ...]'에 메모리를 할당하지 않으면 데이터를 복사 할 수있다.'strncpy (history [0], str, length);'는 실패 할 것이다. –

답변

3

char *history[BUFFER_SIZE];은 아무데도 가리 키지 않는 char*의 배열입니다. 해당 포인터에 strncpy을 시도하면 정의되지 않은 동작이 호출되므로 (아무 것도 가리 키지 않았기 때문에) 세그 폴트로 표시됩니다.

당신 history[0] = "a string"history[0]에서 char*를 할당

, 그래서 history[0] 더 이상 포인터는 아무데도, 그것은 "a string"를 가리키는 없습니다. "a string"은 문자열 리터럴이며 프로그램의 다른 곳에 저장됩니다. 대부분 읽기 전용 섹션입니다. history[0]은 실제로 데이터 "a string"을 포함하지 않으며 단순히 "a string"이있는 주소를 포함합니다.

나는 내가해야 malloc에 ​​또는 초기화 모든 종류의 작업을 수행해야 정확하지 이 같은 문자 배열의 배열을 정의하고 있기 때문에?

당신이하고 싶은 것에 따라 다릅니다. history[0] = "a string"을 수행하는 것은 완벽합니다. 문자열 리터럴이기 때문에 해당 문자열을 수정하려는 것은 정의되지 않은 동작이기도합니다. 문자열 리터럴을 자유롭게 수정할 수있는 메모리 섹션에 복사하려면 malloc 또는 그와 비슷한 메모리를 할당해야합니다. 그러나 char *history[BUFFER_SIZE];은 "char 배열의 배열"을 정의하지 않고 있으며 char 포인터의 배열을 정의하고 있습니다.

+0

아, 이제 알 것 같아요. 그래서 malloc없이 배열을 정의하는 "정적으로"(그 의미를 모르겠다면) 다음과 같이 할 수 있습니다 : char history [BUFFER_SIZE] [str_len]; 이전에했던 것처럼 history [0] = "..."을 할당합니까? 그렇게하면 미리 길이를 할당 할 수 있습니다.그것은 지금 작동하고있는 것 같습니다 – Zhinkk

+1

@Zhinkk 네,'malloc'을 사용하고 싶지 않다면, 컴파일러는 컴파일 시간에 얼마나 많은 공간이 필요한지 알아야합니다. 만약 당신이'char history [BUFFER_SIZE] [MAX_WORD_LENGTH];'와 같은 것을하면,'MAX_WORD_LENGTH-1' 문자까지 최대'MAX_WORD_LENGTH-1' 문자까지'BUFFER_SIZE' 단어까지'strcpy ' 문자열에는 'NUL'종결자가 있어야합니다). – yano

+1

@Zhinkk는 "문자열"이'str_len '보다 길지 않으면 이전처럼'strcpy'를 사용합니다.'='연산자는 문자열을 복사하지 않습니다. – yano

1

history는 포인터의 배열이며 전체 문자열을 크기가 32b 또는 64b 인 것으로 복사 할 수 없습니다.

실제로 스택이나 힙에 관계없이 포인터와 관련된 메모리를 할당해야합니다. 포인터 스택에 주소를 할당하기 전에 문자열에 할당 된 메모리를주는 두 번째 예제입니다.