[英]Pointer addresses are getting overwritten
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
using namespace std;
int d;
long long int *arr = (long long int*)malloc(d * sizeof(long long int));
int* func(){
int *p = (int*)malloc(sizeof(int));
*p =5;
return p;
}
int main(){
int *p = NULL;
p = func();
d =10;
printf("add of p: %d\n\n",p);
int i=0;
for(;i<10;i++){
printf("Add of arr: %d \n",arr+i);
}
return 0;
}
分配给指针“p”的地址被数组“arr”的某个位置的地址覆盖。 为什么会这样? 即使“malloc”在堆中分配 memory。
此外,如果我对“p”和“arr”使用相同的数据类型,则不会出现此类问题。
代码 Output:
你清楚地认为你已经分配了一个大小为 10 的数组。但是当这个表达式被执行时
long long int *arr = (long long int*)malloc(d * sizeof(long long int));
d
的值为零。 d
是一个全局变量,因此默认初始化为零。 令人困惑的是, main
中还有另一个名为d
的变量,但这与arr
的分配完全没有关系。
在将d
设置为 10 之前,您使用d
的值来决定将什么传递给malloc
。 然后,当您将d
的值设置为 10 时,它是一个不同的d
,因为您在全局 scope 有一个,而在main
范围内有一个。
这只是Undefined Behaviour
。 有一些与内存相关的问题(比如访问越界的数组..),其中 C/C++ 只是说明如果所有内容都正确访问并且所有其他内容都未定义会发生什么。 所以它可能有一天会起作用,也可能不会。
就像上面提到的答案一样,您这边的歧义会导致未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.