C에서 배열에 할당 할 수 없습니다. C는 초기화를 허용합니다. 배열은 컴파일 타임 상수 값을 갖습니다. 값을 나중에 변경하거나 컴파일 타임 상수가 아닌 값을 설정하려면 배열의 특정 인덱스에 수동으로 할당해야합니다.
그래서, sXSongBuffer
로 할당 배열이 너무있다 sXSongBuffer[0]
sXSongBuffer[19]
에 있기 때문에, 또한 C에서 허용되지 않습니다, 당신도 말할 수 없다 : sXSongBuffer[0] = "New Song";
을 당신이 원하는에 따라,이 당신을 위해 작동 할 수 있습니다
를
/* declare sXSongBuffer as an array of pointers */
char *sXSongBuffer[30] = {
"Thriller",
"Don't Stop Till You Get Enough",
"Billy Jean",
NULL /* set the rest of the elements to NULL */
};
size_t i;
/* and then later in your code */
sXSongBuffer[0] = "New Song";
sXSongBuffer[1] = "More Music From Me";
for (i=2; i < sizeof sXSongBuffer; ++i)
sXSongBuffer[i] = NULL;
위의 내용은 컴파일 타임에 모든 문자열을 알고있는 경우에만 작동합니다. 그렇지 않다면 "충분히 큰"배열을 원하는지 아니면 문자열 및/또는 문자열의 수에 동적 메모리가 필요한지 결정해야합니다. 두 경우 모두 strcpy()
에 해당하는 문자열을 복사하는 것이 좋습니다.
편집는 :
버프가가 가리키는 즉 당신은 처음 세 요소가 문자열의 크기를 버퍼를 가리키는 30 문자 포인터의 배열을 선언하고 : 주석에 응답하려면 sXSongBuffer[0]
은 "Thriller"
보다 큰 문자열을 보유하지 않으며 그는 sXSongBuffer[0] = malloc(32);
을 수행하면 작은 메모리 리크가 발생합니다. 또한 배열의 나머지 슬롯 각각에 대해 malloc
메모리를 사용해야합니다. 그는 OP + 지정된 init과 같은 2d char 배열을 사용하거나 런타임에 각 버퍼를 malloc
버퍼에 저장하고 값을 복사해야합니다. 그는 또한 free
어떤 기억을 그는 malloc
s 기억해야합니다. char *sXSongBuffer[30];
에
sXSongBuffer
각 소자는 char *
, char
포인터 인 상태, 크기 (30)의 배열이다. 내가 할 때 :
char *sXSongBuffer[30];
각 30 포인터는 초기화되지 않습니다.내가 할 때 :
char *sXSongBuffer[30] = { "Thriller", ... };
나는 다른 읽기 전용 위치에 포인터를 설정한다. 포인터가 다른 곳으로 "다시 가리키는"것을 방지 할 수있는 방법은 없습니다. 내가 가진 것과 같다 :
위의 코드에서
char *data = "Hello";
printf("%s\n", data);
data = "Hello, world";
printf("%s\n", data);
가, 나중에 더 긴 문자열을 가리 키도록 변경 먼저 data
"Hello"
에 할당합니다. 내 대답에 위의 코드는 sXSongBuffer[i]
을 나중에 다른 것으로 재 할당하는 것 이상을 수행했으며 sXSongBuffer[i]
이 포인터이기 때문에 할당이 OK입니다. 특히 sXSongBuffer[0]
은 char *
이며 유효한 위치 인 char
을 가리킬 수 있습니다.
나중에 말했듯이 문자열이 컴파일 타임에 알려지지 않은 경우이 스키마가 작동하지 않으며 "충분히 큰"크기의 배열을 사용하거나 동적으로 메모리를 할당해야합니다. 충분히 커.
문자열의 크기를 가리키는 처음 세 요소, 즉'sXSongBuffer [0]'이 가리키는 buff은 "Thriller"보다 큰 문자열을 보유하지 않고 30 개의 char 포인터 배열을 선언합니다. if 그는'sXSongBuffer [0] = malloc (32);'그는 작은 메모리 리크를 얻을 것이다. 또한 배열의 나머지 슬롯 각각에 대해 메모리를 malloc해야합니다. 그는 OP + 지정된 init과 같은 2 차원 char 배열을 사용하거나 런타임에 각 버퍼를 malloc하여 값을 복사해야합니다. 그는 또한 그가 mallocs 어떤 기억든지 해방하는 것을 기억할 필요가있을 것이다. –
@ 로버트 : 내 편집을 참조하십시오. –