我很难理解这种行为,所以也许有人可以对这种情况有所了解。 我根本无法弄清楚为什么我不能从方法返回指向结构的指针,并希望以后能够重新使用它。
正如您所看到的,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;
}
您可以看到插入评论的位置出现问题。
我知道这可能是我不应该错过的完全基本的东西..
答案 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;
}
希望这有帮助。