动态长度数组

时间:2019-08-16 08:00:28

标签: c arrays pointers dynamic-memory-allocation

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    char *names = NULL;
    int capacity = 0;
    int size = 0;

    printf("Type 'end' if you want to stop inputting names\n");
    while (1) {
        char name[100];
        printf("Input:\n");
        fgets(name, sizeof(name), stdin);

        if (strncmp(name, "end", 3) == 0) {
            break;
        }

        if (size == capacity) {
            char *temp = realloc(names, sizeof(char) * (size + 1));

            if (!temp) {
                if (names) {
                    return 1;
                }
            }
            names = temp;
            capacity++;
        }

        names[size] = name;
        size++;
    }

    for (int i = 0; i < size; i++) {
        printf("OUTPUT :%c\n", names[i]);
    }

    if (names) {
        free(names);
    }
}

我正在尝试在C中创建一个动态长度数组,但是我不知道我的代码有什么问题?我认为这是我如何接受用户输入的原因,并且在执行代码names[size] = name时出现了问题。

2 个答案:

答案 0 :(得分:2)

您需要声明一个指向字符串(char **)的指针数组,而不是指向单个字符串(char *)的指针。

这意味着当您要添加新条目时,不仅需要为数组中的新指针(类型为@Directive({ selector: `input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]`, ... providers: [{provide: MatFormFieldControl, useExisting: MatInput}], }) 而不是char*)留出空间,而且还必须分别为字符串本身分配存储空间,然后将刚刚为其留出空间的指针设置为该已分配字符串。

答案 1 :(得分:0)

代码中存在多个问题:

  • names应该定义为指向char *char **names = NULL;
  • 数组的指针
  • 您必须使用fgets()读取字符串的副本,否则names中的所有条目将指向相同的数组name
  • 如果您一次重新分配一个额外的广告位,则实际上不需要区分capacitysize
  • "OUTPUT :%c\n"的格式不适用于字符串。

这是更正的版本:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    char **names = NULL;
    int capacity = 0;
    int size = 0;

    printf("Type 'end' if you want to stop inputting names\n");
    for (;;) {
        char name[100];
        printf("Input:\n");
        if (!fgets(name, sizeof(name), stdin)) {
            break;
        }
        if (strncmp(name, "end", 3) == 0) {
            break;
        }
        if (size == capacity) {
            // reallocate array with geometric growth
            int new_capacity = capacity + (capacity / 2) + 4;
            char *temp = realloc(names, sizeof(*names) * new_capacity);
            if (!temp) {
                free(names);
                printf("out of memory\n");
                return 1;
            }
            names = temp;
            capacity = new_capacity;
        }
        name[strcspn(name, "\n")] = '\0';  // strip the trailing newline if any
        names[size++] = strdup(name);      // allocate a copy of the string
    }
    for (int i = 0; i < size; i++) {
        printf("OUTPUT: %s\n", names[i]);
    }
    free(names);
    return 0;
}