分配内存到char **

时间:2016-04-11 00:24:19

标签: c dynamic realloc calloc

该计划旨在获得第一个单词和一系列剩余单词。例如,如果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]);
    }
}

e.g。 行:

"a bb cc dd ee"

预期产出:

key: a
keySet: bb cc dd ee

我的输出:

key: a
keySet: ee ee ee ee

1 个答案:

答案 0 :(得分:1)

keySet[count++] = tempKey;:您可能需要str(n)cpystrdup。目前,tempKey每次都会重新分配,所有keySet元素都指向相同的 tempKey。因此,在上一次tempKey分配后,它们都指向"ee"。 (请注意,如果您使用strcpy,则需要先为keySet[count++]分配内存; strdup一次性完成分配和分配,但您必须测试{之后{1}}。)

因此:

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

根据this answer

不要忘记随后释放单个keySet[count] = malloc(strlen(tempKey)+1); // test for keySet[count] 1= NULL strcpy(keySet[count], tempKey) count++; 元素。