使用字符串和Malloc / Realloc

时间:2013-09-24 21:09:25

标签: c malloc realloc

老实说,我是c的新手。因此,像malloc和realloc这样的东西是外来概念。我认为我已经掌握了基础知识,但我不能完全达到100%。

while (int args = scanf("%s", string)) {
    if (args < 0) break;
    count++;

    if (array == NULL) {
        array = (char *) malloc(strlen(string));

        if (array == NULL) {
            printf("Error allocating memory");
            exit(1);
        }
    } else {
        printf("%s %d\n", string, strlen(string));
        array = (char *) realloc(array, (sizeof(array) + strlen(string) + 1));

        if (array == NULL) {
            printf("Error allocating memory");
            free(array);
            exit(1);
        }

        printf("%lu\n", sizeof(array));
    }

    strcpy(&array[count - 1], string);
}

它是从终端读取 - 猫文件| ./program,只是一堆任意长度的单词。我正试图将它们全部放入一个数组(数组)中。

编辑:我应该知道我正在尝试访问我没有分配的内存:malloc: *** error for object 0x7fe9e04039a0: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug Segmentation fault: 11

2 个答案:

答案 0 :(得分:2)

看起来你不明白C中的指针,字符串和char *是什么。例如,here是一些描述。

以下是主要问题:

  1. char *不是字符串类型。它指向内存中的一个位置,其中字符串数据位于char-by-char并以char'\ 0'结尾(null终结符)
  2. 因此,strcpy只是将一堆字符从一个地方(字符串变量)复制到另一个地方。在您的情况下,它将它们复制到数组,从元素count-1开始。因此,如果您读取的字符串长度超过1个字符,则会丢失数据。您可能想要做的是所有前面的字符串的总和,并从这个地方开始写。
  3. 剩下的问题是:在第一次迭代期间没有为null终止符分配空间(这会导致strcpy访问未分配的内存,并可能导致在程序终止后看到的消息)。

答案 1 :(得分:1)

为简化流程,我最终选择char ** array代替char * array。对于我的while循环的每次迭代(顺便说一下,现在while (scanf("%s", string) > 0)符合gcc标准(我最初用g ++编译)),realloc使用count x { {1}}然后我最终可以sizeof(char *)array[count - 1] = (char *) malloc(sizeof(string + 1)