【问题标题】:How would I append a 2D array of char dynamically?我将如何动态附加一个 char 的二维数组?
【发布时间】:2021-01-26 11:30:54
【问题描述】:

这段代码引发了分段错误,我并不完全是我做错的地方。一旦我输入一个字符串,它就会导致分段错误。我期待它在 char 数组的新元素中附加一个新字符串。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char** append(char** b, size_t* size, char target[]);
int main(){
    size_t size = 1;
    char** b = malloc(sizeof(char)*size);
    while(1){
      char input[100] = "";
      scanf("%99s", input);
      if (strcmp(input, "end") == 0)
          break;
      b = append(b, &size, input);
    }
    for(int i = 0; i < size; i++)
        printf("%s ", b[i]);
    return 0;
}
char** append(char** arr, size_t* size, char target[]){
    *size += 1;
    size_t b = *size;
    char** new_arr = realloc(arr, b * sizeof(char));
    strcpy(new_arr[b - 1], target);
    return new_arr;
}

【问题讨论】:

  • Don't cast malloc result char **b 应该是char *b
  • 你想要一个字符串数组,还是一个接一个地追加字符串?
  • 为什么会这样?我想做一个二维字符数组
  • @Izzuddin667 这个语句 scanf("%s", input);调用未定义的行为,因为指针输入未初始化。
  • 阅读Modern Cthis C reference。有关替代方法,请参阅this answer。阅读您的 C 编译器(例如GCC,用作gcc -Wall -Wextra -g...)和调试器(例如GDB...)的文档。您可能对valgrind 感兴趣

标签: arrays c char


【解决方案1】:

保持你的逻辑有一个最后一个空元素。 你想要一个char * 的数组,所以你需要分配size * sizeof(char *)

scanf 需要内存并检查返回值 然后你需要复制扫描字符串,例如使用strdup

列表可能更适合您的情况

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char** append(char** b, size_t* size, const char* target);
int main(){
    size_t size = 1;
    char** b = malloc(sizeof(char*)*size);
    while(1){
      char input[256];
      int res = scanf("%s", input);
      if (res == EOF || strcmp(input, "end") == 0)
          break;
      b = append(b, &size, input);
    }
    for(int i = 0; i < size; i++)
        printf("%s ", b[i]);
    printf("\n");
    return 0;
}
char** append(char** arr, size_t* _size, const char* target){
    size_t size = *_size;
    arr[size - 1] = strdup(target);
    size++;
    char** new_arr = realloc(arr, size * sizeof(char *));
    *_size = size;
    return new_arr;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2016-05-29
    • 2015-07-17
    • 2021-10-29
    相关资源
    最近更新 更多