gpt4 book ai didi

c - 为 char** 分配内存

转载 作者:行者123 更新时间:2023-11-30 15:09:42 26 4
gpt4 key购买 nike

该程序的目标是获取第一个单词和剩余单词的数组。例如,如果 line = "a bb cc dd ee",则 key 应为 akeySet 应为是一个指向{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)cpystrdup。目前,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 元素。

关于c - 为 char** 分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36538009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com