0

老实说,我是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);
}

它正在从终端读取 - cat 文件 | ./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

4

2 回答 2

2

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

以下是主要问题:

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

为了简化这个过程,我最终选择了 achar ** array而不是 a char * array。对于我的while循环的每次迭代(顺便说一句,现在while (scanf("%s", string) > 0)符合gcc标准(我最初用g ++编译)),我realloc使用countxsizeof(char *)然后我array[count - 1] = (char *) malloc(sizeof(string + 1)终于可以了,strcpy(array[count - 1], string)

于 2013-09-24T22:35:41.190 回答