将内存分配给 char**

Allocation memory to char**

该程序旨在获取第一个单词和剩余单词的数组。例如,如果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)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 元素。