0

我很难理解这种行为,所以也许有人可以对这种情况有所了解。我根本想不通为什么我不能从一个方法返回一个指向结构的指针,并期望之后仍然能够重用它。

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

我已经用我的 Eclipse 调试器检查了所有调用的位置matrix->A是相同的(0x7ffffffffe180 - 所以就我所知的 C 指针,任何形式的访问该 int 都应该返回正确的值 - 无论是 *(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;
}

您可以在我插入评论的地方看到问题。

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

4

3 回答 3

3

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

于 2012-06-25T23:22:42.647 回答
1

这条线

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

只为您的 ysmf 结构分配足够的空间,在这种情况下,它只是一个 int 指针。所以你然后去把它指向'a'。

matrix->A = a;

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

如果您改为为“a”分配内存并将您的结构指向那个,那么您就可以了。

于 2012-06-25T23:33:35.640 回答
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;
}

希望这可以帮助。

于 2012-06-25T23:37:13.800 回答