C语言结构体数组指针打印随机数问题及取值打印方案问询
问题解决:数组指针打印元素值的正确方式
问题根源
你的Stack结构体里,Arr是指向长度为10的int数组的指针(int (*Arr)[10]),而你在print_Stack里直接写pilha->Arr[x],这会触发错误的指针算术:
- C语言中
pilha->Arr[x]等价于*(pilha->Arr + x),这里的+x是按int[10]的大小偏移(假设int占4字节,每次跳40字节),直接越界访问了原数组之外的内存,打印的自然是随机垃圾值。
针对数组指针的解决方案
下面两种写法都能正确打印元素值,本质都是先拿到指向单个int的指针,再解引用:
写法一:先解引用数组指针得到数组,再访问元素
修改print_Stack函数:
void print_Stack(Stack *pilha) { for (int x = 0; x < pilha->size; x++) { // 先解引用Arr,拿到它指向的int[10]数组,再取第x个元素 printf("%d ", (*pilha->Arr)[x]); } }
写法二:用指针偏移直接定位元素
如果想更贴近底层指针操作,可以这么写:
void print_Stack(Stack *pilha) { for (int x = 0; x < pilha->size; x++) { // 先解引用Arr得到数组首元素的指针,再偏移x个int,最后解引用 printf("%d ", *(*pilha->Arr + x)); } }
原理讲解
- 类型辨析:
int (*Arr)[10]是数组指针,它指向的是一整个长度为10的int数组,而不是单个int。它的大小是一个指针的大小(比如8字节,64位系统),但它的算术运算单位是int[10]的大小。 - 正确解引用流程:
- 第一步:
*pilha->Arr——解引用数组指针,得到它指向的int[10]数组,此时数组名会隐式转换为指向数组首元素的int*指针。 - 第二步:用
[x]或者+x对这个int*指针做偏移,就能定位到第x个元素,最后解引用就能拿到元素值。
- 第一步:
内容的提问来源于stack exchange,提问作者KalebSUS
相关产品推荐
相关产品推荐

