在结构中传递int指针

时间:2012-06-25 23:19:57

标签: c pointers struct

我很难理解这种行为,所以也许有人可以对这种情况有所了解。 我根本无法弄清楚为什么我不能从方法返回指向结构的指针,并希望以后能够重新使用它。

正如您所看到的,generateSmallMatrix()方法创建了一个int []数组并将其设置在ysmf结构中,然后返回main。然后Main接受ysmf *并再次调用printArray。在第三次尝试时,无法再检索数组.. 这让我发疯了......

我已经用我的Eclipse调试器检查过,在所有调用中matrix->A的位置是相同的(0x7fffffffe180 - 所以我对C指针的所有知识都知道,任何形式的访问都应该返回正确的值 - 是* (ax ++)或ax [i])..但两者都没有..

至少可以说非常令人沮丧,所以这里是代码:

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

typedef struct sparseMatrix
{
    int* A;
} ysmf;

void printArray(int* ax, int length) {
    int i = 0;
    for (i = 0; i < length; i++) {
        printf("%i,", ax[i]);
    }
    printf("\n");
}

ysmf* generateSmallMatrix()
{
    ysmf *matrix = malloc(sizeof(ysmf));

    int a[] = {1,2,3,9,1,4};
    printArray(a, 6);                   // returns 1,2,3,9,1,4,
    matrix->A = a;
    printArray(matrix->A, 6);           //returns 1,2,3,9,1,4,
    //printArray(matrix->A, 6);

    return matrix;
}


int main(void) {
    ysmf* matrix = generateSmallMatrix();
    printArray(matrix->A, 6);           //returns 1,6,-7856,32767,1,4,
    return EXIT_SUCCESS;
}

您可以看到插入评论的位置出现问题。

我知道这可能是我不应该错过的完全基本的东西..

3 个答案:

答案 0 :(得分:3)

因为a是一个本地数组,其生命周期在generateSmallMatrix()函数结束时结束。之后访问它会导致未定义的行为

答案 1 :(得分:1)

这一行

ysmf *matrix = malloc(sizeof(ysmf));

为ysmf结构分配足够的空间,在本例中,它只是一个int指针。所以你接着指着'a'。

matrix->A = a;

问题是a在堆栈上。所以它现在指向这个内存地址,但当你退出该函数时,不再为该数组保留内存。

如果您将内存替换为'a'并将结构指向该结构,那么您就可以了。

答案 2 :(得分:1)

试试这个......

ysmf* generateSmallMatrix()
{
    ysmf *matrix = malloc(sizeof(ysmf));

    int a[] = {1,2,3,9,1,4};
    printArray(a, 6);

    matrix->A = malloc(sizeof(int) * 6);
    memcpy(matrix->A, a, sizeof(int) * 6);
    printArray(matrix->A, 6);

    return matrix;
}

现在,在generateSmallMatrix函数之外,您应该能够打印正确的值。但是,一定要释放malloc的内容。

int main(void) {
    ysmf* matrix = generateSmallMatrix();
    printArray(matrix->A, 6);

    free(matrix->A);
    free(matrix);

    return EXIT_SUCCESS;
}

希望这有帮助。