在结构中保存指向数组的指针
Save pointer to array in struct
在结构中保存指向数组的指针。
我想将指向 int 数组的指针存储到结构中,但我遇到了麻烦。
在我的代码下方附有注释:
typedef struct _index {
int *data;
} Index;
void adder(struct _index *s){
int i;
int arr[maxint];
for(i=0; i<maxint; i++) {
arr[i] = i+42;
}
//i got a gibberish
//s->data = arr;
//works fine
s->data = (int *) malloc(maxint * sizeof(int));
s->data = memcpy(s->data, arr, maxint * sizeof(int));
)
int main() {
Index n;
int i;
//this method also works.
//int arr[maxint];
//for(i=0; i<maxint; i++) {
// arr[i] = i+42;
//
//}
//n.data = arr;
adder(&n);
for(i=0; i<maxint;i++) {
printf("%d-", n.data[i]);
}//testing
return 0;
}
当我做作业时,我得到了奇怪的数字:
117-118-119-120-12-0-22-2292964-0-2293008-127-0-129-130-131-0-0-0-0-0-0-138-0
但如果我使用 malloc
和 memcpy
一切正常
您在第一个案例中遇到了乱码,因为您试图通过指针从函数中 "return" 获取局部变量的地址。一旦函数完成执行,int arr[maxint];
将无效。换句话说,在 adder()
完成执行后, int arr[maxint];
超出范围并且它的生命周期结束了。因此,(returned) 指针变得无效,在调用函数中进一步使用它会导致 undefined behaviour.
解决方案:
- 正如您所做的那样,使用动态内存。
- 使用
static
变量(不是一个好方法,但可行)。
在上述两种方法中,变量(静态arr
数组/malloc()
ed内存)的生命周期不限于函数范围,因此指向内存的指针将有效在调用函数中。
adder()
函数中的数组 arr
在堆栈上,并且仅当该函数中的代码为 运行 时才存在。一旦 adder()
returns 该内存被程序的其余部分重新使用,其内容将被覆盖。
int arr[]
被放置在堆栈中,并在超出范围时从堆栈中删除。所以你会指向垃圾
如果将它包含在 main 中,它会工作得很好,因为那样它还没有超出范围。
Malloc 之所以有效,是因为您分配了内存,而不仅仅是将它放在堆栈上。
在结构中保存指向数组的指针。 我想将指向 int 数组的指针存储到结构中,但我遇到了麻烦。
在我的代码下方附有注释:
typedef struct _index {
int *data;
} Index;
void adder(struct _index *s){
int i;
int arr[maxint];
for(i=0; i<maxint; i++) {
arr[i] = i+42;
}
//i got a gibberish
//s->data = arr;
//works fine
s->data = (int *) malloc(maxint * sizeof(int));
s->data = memcpy(s->data, arr, maxint * sizeof(int));
)
int main() {
Index n;
int i;
//this method also works.
//int arr[maxint];
//for(i=0; i<maxint; i++) {
// arr[i] = i+42;
//
//}
//n.data = arr;
adder(&n);
for(i=0; i<maxint;i++) {
printf("%d-", n.data[i]);
}//testing
return 0;
}
当我做作业时,我得到了奇怪的数字: 117-118-119-120-12-0-22-2292964-0-2293008-127-0-129-130-131-0-0-0-0-0-0-138-0
但如果我使用 malloc
和 memcpy
一切正常
您在第一个案例中遇到了乱码,因为您试图通过指针从函数中 "return" 获取局部变量的地址。一旦函数完成执行,int arr[maxint];
将无效。换句话说,在 adder()
完成执行后, int arr[maxint];
超出范围并且它的生命周期结束了。因此,(returned) 指针变得无效,在调用函数中进一步使用它会导致 undefined behaviour.
解决方案:
- 正如您所做的那样,使用动态内存。
- 使用
static
变量(不是一个好方法,但可行)。
在上述两种方法中,变量(静态arr
数组/malloc()
ed内存)的生命周期不限于函数范围,因此指向内存的指针将有效在调用函数中。
adder()
函数中的数组 arr
在堆栈上,并且仅当该函数中的代码为 运行 时才存在。一旦 adder()
returns 该内存被程序的其余部分重新使用,其内容将被覆盖。
int arr[]
被放置在堆栈中,并在超出范围时从堆栈中删除。所以你会指向垃圾
如果将它包含在 main 中,它会工作得很好,因为那样它还没有超出范围。
Malloc 之所以有效,是因为您分配了内存,而不仅仅是将它放在堆栈上。