c - 段错误 : struct, 指针,二维数组

标签 c

我正在研究指针和结构。这是我一直在搞乱的程序。我收到段错误,但我不知道为什么。我已经浏览了一段时间,但似乎无法查明问题所在。有人可以向我解释一下吗?

编辑:在 createArray 中,我在 *purp[i][j] = '1'; 处遇到段错误;

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

struct purple_struct{
  int x;
  int y;
  char **purp;
};

void print(int x, int y){
    printf("%d %d\n", x, y);

    return;
}

void createArray(char*** purp, int x, int y){
    int i, j;

    for (i = 0; i < x; ++i){
        for (j = 0; j < y; ++j){
            *purp[i][j] = '1';
        }
    }

    return;
}

int main(){
    int i, j;

    struct purple_struct dog;

    dog.x = 3;
    dog.y = 4;

    dog.purp = (char **)malloc(dog.x * sizeof(char *));
    for (i = 0; i < dog.x; ++i){
        dog.purp[i] = (char *)malloc(dog.y * sizeof(char));
    }

    createArray(&dog.purp, dog.x, dog.y);

    for (i = 0; i < dog.x; ++i){
        for (j = 0; j < dog.y; ++j){
            printf("%c", dog.purp[i][j]);
        }
    }

    print(dog.x, dog.y);

    return 0;
}

最佳答案

您需要了解operator precedence的概念。就像在数学中一样,1 + 2 × 3 等表达式表示 1 + (2 × 3) 而不是 (1 + 2) × 3,编程语言对表达式中不同运算符的执行顺序有规则。

C 的规则在这里:http://en.cppreference.com/w/c/language/operator_precedence

就您而言,问题是 *purp[i][j] 实际上意味着 *(purp[i][j]),而不是您所期望的 (*purp)[i][j]。

关于c - 段错误 : struct, 指针,二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37710471/

相关文章:

c - Matlab 在使用某些数据运行 mex 函数时崩溃

c - 如何等到文件在 C 中创建

c - 找不到 glib.h

c++ - #ifdef 和#endif 中无法访问的代码是否在编译/链接期间被删除?

这个可以优化吗?

c - 为什么我要在 C 中按值传递函数参数?

c - printf 如何知道在符号扩展后要打印什么

c - 为什么我在这里收到不兼容的指针类型警告?

c - 使用无符号值返回错误?

c - 如何在函数中动态分配数组?