将内存分配给 char**
Allocation memory to char**
该程序旨在获取第一个单词和剩余单词的数组。例如,如果line = "a bb cc dd ee"
,那么key
应该是a
,keySet
应该是指向{bb,cc,dd,ee}
数组的指针。
我尝试动态分配内存给 char** keySet
,但 keySet 输出总是 ee ee ee ee
。 keySet 似乎不是指向数组第一个元素的指针,而是指向最后一个元素。我的函数有什么问题?
void allocateKeySet(char* line){
int count = 0;
char* token = strtok(line, " ");
char key[17];
char tempKey[17];
char** keySet;
sscanf(strtok(NULL, " "), " %s", key);
keySet = calloc(1, sizeof(char*));
while((token = strtok(NULL, " ")) != NULL){
sscanf(token, " %s", tempKey);
keySet[count++] = tempKey;
keySet = realloc(keySet, (count+2) * sizeof(char*));
}
printf("key: %s\n", key);
printf("keySet: ");
for(int i = 0; i < count - 1; i++){
printf("%s ", keySet[i]);
}
}
例如
行:
"a bb cc dd ee"
预期输出:
key: a
keySet: bb cc dd ee
我的输出:
key: a
keySet: ee ee ee ee
keySet[count++] = tempKey;
:你可能想要str(n)cpy
,或者strdup
。目前,tempKey
每次都会重新分配,并且所有 keySet
元素都指向 相同的 tempKey
。因此,在最后一个 tempKey
赋值后,它们都指向 "ee"
。 (请注意,如果您使用 strcpy
,您需要先为 keySet[count++]
分配内存;strdup
一次性完成分配和分配,但您必须测试 NULL
无论如何之后。)
因此:
while((token = strtok(NULL, " ")) != NULL){
sscanf(token, " %s", tempKey);
keySet[count] = strdup(tempKey);
if (keySet[count] == NULL) {
perror("memory allocation failure");
}
count++;
keySet = realloc(keySet, (count+2) * sizeof(char*));
}
如果您不能使用 strdup
,您可以使用以下行代替 strdup
行:
keySet[count] = malloc(strlen(tempKey)+1);
// test for keySet[count] 1= NULL
strcpy(keySet[count], tempKey)
count++;
根据 this answer.
之后不要忘记释放单个 keySet
元素。
该程序旨在获取第一个单词和剩余单词的数组。例如,如果line = "a bb cc dd ee"
,那么key
应该是a
,keySet
应该是指向{bb,cc,dd,ee}
数组的指针。
我尝试动态分配内存给 char** keySet
,但 keySet 输出总是 ee ee ee ee
。 keySet 似乎不是指向数组第一个元素的指针,而是指向最后一个元素。我的函数有什么问题?
void allocateKeySet(char* line){
int count = 0;
char* token = strtok(line, " ");
char key[17];
char tempKey[17];
char** keySet;
sscanf(strtok(NULL, " "), " %s", key);
keySet = calloc(1, sizeof(char*));
while((token = strtok(NULL, " ")) != NULL){
sscanf(token, " %s", tempKey);
keySet[count++] = tempKey;
keySet = realloc(keySet, (count+2) * sizeof(char*));
}
printf("key: %s\n", key);
printf("keySet: ");
for(int i = 0; i < count - 1; i++){
printf("%s ", keySet[i]);
}
}
例如 行:
"a bb cc dd ee"
预期输出:
key: a
keySet: bb cc dd ee
我的输出:
key: a
keySet: ee ee ee ee
keySet[count++] = tempKey;
:你可能想要str(n)cpy
,或者strdup
。目前,tempKey
每次都会重新分配,并且所有 keySet
元素都指向 相同的 tempKey
。因此,在最后一个 tempKey
赋值后,它们都指向 "ee"
。 (请注意,如果您使用 strcpy
,您需要先为 keySet[count++]
分配内存;strdup
一次性完成分配和分配,但您必须测试 NULL
无论如何之后。)
因此:
while((token = strtok(NULL, " ")) != NULL){
sscanf(token, " %s", tempKey);
keySet[count] = strdup(tempKey);
if (keySet[count] == NULL) {
perror("memory allocation failure");
}
count++;
keySet = realloc(keySet, (count+2) * sizeof(char*));
}
如果您不能使用 strdup
,您可以使用以下行代替 strdup
行:
keySet[count] = malloc(strlen(tempKey)+1);
// test for keySet[count] 1= NULL
strcpy(keySet[count], tempKey)
count++;
根据 this answer.
之后不要忘记释放单个 keySet
元素。