将int成员添加到C结构会导致段错误

时间:2009-02-24 02:01:27

标签: c struct malloc segmentation-fault

我还在学习C,并开始使用它来生成图像。我无法弄清楚为什么我的一个程序是segfaulting。这是源代码,减少到40行:

#include <stdio.h>
#include <stdlib.h>
struct color {
        unsigned char r, g, b;
};
struct image {
        int w, h/*, o*/;
        struct color **data;
};
int main() {
        // Declarations
        int x, y;
        struct color *black;
        struct image *img;
        // Set up color black
        black = (struct color *) malloc(sizeof(struct color *));
        black->r = 0;
        black->g = 0;
        black->b = 0;
        // Set up image img
        img = (struct image *) malloc(sizeof(struct image *));
        img->w = 1;
        img->h = 1;
        /*img->o = 0;*/
        img->data = (struct color **) malloc(img->h * sizeof(struct color *));
        for (y = 0; y < img->h; y++) {
                img->data[y] = (struct color *) malloc(img->w * sizeof(struct color));
        }
        // Fill in img with black
        for (x = 0; x < img->w; x++) {
                for (y = 0; y < img->h; y++) {
                        img->data[y][x].r = black->r;
                        img->data[y][x].g = black->g;
                        img->data[y][x].b = black->b;
                }
        }
        // Free black
        free(black);
        // Free img
        for (y = 0; y < img->h; y++)
                free(img->data[y]);
        free(img->data); // Segfaults
        free(img); // Also segfaults
        return 0;
}

它编译并运行正常(在Ubuntu上使用gcc,在使用Cygwin的Vista上使用gcc),但是取消注释处理img-&gt; o的两行会打破它。我有一种感觉它与this previous question有关,但我正在考虑所有需要进行摩托车化处理的东西(我想)。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:21)

您的malloc语句中存在错误。你正在使用指针而不是结构。这样只需要4个字节的内存,而不是结构所需的实际大小。

black = malloc(sizeof(*black));

为指针分配内存时,需要为指向的东西分配内存,指针的类型。如果您只是如图所示编写sizeof(*black),即使black的类型发生变化,您也会始终获得正确的类型。

答案 1 :(得分:1)

乍一看,似乎你正在使用额外级别的指针间接,这导致了段错误。当你使用malloc内存时,它是指向对象的指针,而不是指向对象指针的指针。所以你会:

img = (struct image *)malloc(sizeof(struct image))
img->o = 0

答案 2 :(得分:1)

JaredPar有正确的答案,但如果你得到段错误,首先要做的是在valgrind下运行程序。这对处理这样的问题是一个巨大的帮助。

顺便说一下,我已经浪费了几天的确切错误。很高兴你在C编程生涯的早期就遇到过它,并且将来一直都会关注它。

答案 3 :(得分:0)

哎呀,代码被切掉了;我忘了逃避一个不太好的标志。这是:

#include <stdio.h>
#include <stdlib.h>
struct color {
    unsigned char r, g, b;
};
struct image {
    int w, h/*, o*/;
    struct color **data;
};
int main() {
    // Declarations
    int x, y;
    struct color *black;
    struct image *img;
    // Set up color black
    black = (struct color *) malloc(sizeof(struct color *));
    black->r = 0;
    black->g = 0;
    black->b = 0;
    // Set up image img
    img = (struct image *) malloc(sizeof(struct image *));
    img->w = 1;
    img->h = 1;
    /*img->o = 0;*/
    img->data = (struct color **) malloc(img->h * sizeof(struct color *));
    for (y = 0; y < img->h; y++) {
        img->data[y] = (struct color *) malloc(img->w * sizeof(struct color));
    }
    // Fill in img with black
    for (x = 0; x < img->w; x++) {
        for (y = 0; y < img->h; y++) {
            img->data[y][x].r = black->r;
            img->data[y][x].g = black->g;
            img->data[y][x].b = black->b;
        }
    }
    // Free black
    free(black);
    // Free img
    for (y = 0; y < img->h; y++)
        free(img->data[y]);
    free(img->data);
    free(img);
    // Return
    return 0;
}