【问题标题】:Working with "multidimensional" "dynamic arrays" in C在 C 中使用“多维”“动态数组”
【发布时间】:2012-01-10 00:25:11
【问题描述】:

我一直在尝试执行以下代码。虽然任务很简单,但我遇到了分段错误。

sn-p betlow 代码的目的是创建一个最大行大小为 4,列大小为 33 的多维数组。然后在创建后,它应该将所有行的内容设置为 0,然后是一个 @987654322 @ 特点。最后,它应该在stdout 上显示输出。

虽然我不是编程新手,但我不断收到类似的错误,所以如果可能的话,请解释一下我以后如何避免此类错误。

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

int main(int argc, char* argv[])
{
        int i,j,k,x,y;
        char** arr;
        arr = (char**) malloc(4 * sizeof(char*));
        for ( i = 0; i < 4; i++) {
                arr[i] = (char*) malloc(9 * sizeof(char));
                memset(arr,0,8);
                arr[i][8] = '\0';
        }
        for ( j = 0; j<4; j++) {
                puts(arr[j]);
        }
        return 0;
}

【问题讨论】:

  • 转换malloc 通常是错误的,因为它可能隐藏错误。 (Relevant reading)
  • 您在这里构建的东西通常被称为“不规则数组”或“锯齿数组”,它不同于您可以使用char arr[33][4] 声明的普通二维数组;不规则数组只是c中动态多维数组问题的几种解决方案之一。
  • 您还需要 free() 使用 malloc() 分配的内存块。添加 for(j=0;j

标签: c multidimensional-array segmentation-fault


【解决方案1】:

memset输入了错误的指针。

代替:

memset(arr,0,8);

你想要的:

memset(arr[i],0,8);

所以你偏离了一层间接性。


正如 cmets 中指出的,这里有一些优化:

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) malloc(9 * sizeof(char));
    memset(arr[i],0,9);
}

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) calloc(9, sizeof(char));
}

请注意,在 C 中不需要强制转换为 char*


如果你想要字符 '0' 而不是空字符,那么你应该使用这个:

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) malloc(8 * sizeof(char));
    memset(arr[i],'0',8);
    arr[i][8] = '\0';
}

【讨论】:

  • +1: 并且代码应该使用memset(arr[i], '\0', 9);,这样就不需要单独分配额外的0字节了。
  • 或者只使用calloc() 而不是malloc() 并忘记它:)
  • +1 用于解决 seg-fault;但从描述来看,我认为 OP 可能 实际上需要 memset(arr[i],'0',8) (将每个元素设置为长度为 8 的以空字符结尾的零字符串)。
  • @ruakh 可能是,不完全清楚 OP 想要 '\0' 还是 '0'。
  • OP想要用'0'填充字符串,打印'\0'不会产生任何输出。
【解决方案2】:
memset(arr,0,8);

是问题所在,您正在清除指针数组

尝试:

memset(arr[i], '0', 8);

假设你想用零填充字符串

【讨论】:

    【解决方案3】:

    在for循环中我认为你有一个逻辑错误:

    memset(arr[i],0,8);
    

    你也不需要设置这个:

    arr[i][8] = '\0';
    

    您可以这样做:

    memset(arr[i],0,9);
    

    '\0' 字符与 0 没有什么不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 2011-02-16
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多