segfault错误:struct,pointer,2D array

时间:2016-06-08 18:44:23

标签: 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;
}

2 个答案:

答案 0 :(得分:2)

您需要了解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]正如你所期望的那样。 / p>

答案 1 :(得分:0)

void createArray(char*** purp, int x, int y){
*purp[i][j] = '1';

我认为他们应该

void createArray(char** purp, int x, int y){
purp[i][j] = '1';

在主要

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

'&安培;'这里不需要,因为你已经传递了一个指针。 '&安培;'通常用于传递变量的地址。 纠正这些事情,它编译得很好,不确定你想做什么。