用C语言编译,跑起来,运行出错,请帮帮忙

0

以下是遍历一个数组,使用指针,但是报错...请帮忙看看是什么问题,特别是 变量  len 初始化是 3,后面会被无缘无故地修改??

请使用C编译器

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int a[] = { 300, 100, 200 };
	int len = sizeof(a) / sizeof(int);
	int* p = malloc(sizeof(int*) * len);
	int** pp = &p; 
	for (int i = 0; i < len; i++)		// 前两次能正确输出 300,100,但是第三次循坏就出错了
	{
		*(pp + i) = &(a[i]);
		printf("%p = %d\n", &(a[i]), a[i]);				// 输出数组元素地址 及 值
		printf("%p = %d\n", *(pp + i), **(pp + i));		// 输出数组元素地址 及 值
	}   
	free(p);											// 这里也报一个错误
	system("pause");
	return 0;
}
C
ava
鱼む翅

2020-9-23

0

你没有说明你的程序要实现什么功能。我理解的是:你希望在 p 指向的空间里,保存数组 a 的每个元素的地址,是吗?

如果是的话,你的错误在这里:

*(pp + i) = &(a[i]);

应该写成:

*(*pp + i) = &(a[i]);

原因解析:

你的 pp 值为变量 p 的地址;变量 p 的值,为数组 a 的地址。你把变量 p 的地址和值搞混了。*pp 才是指向新分配的空间的指针。

同时,你给 *(pp + i) 赋值,因为 i 为 0,实际你的赋值对象是 *pp,也就是 *p。就是说,你修改了 p 指针的值,导致 free 的时候释放的并不是当初分配的地址,所以出错。

ava
慢羊羊

2020-9-23

技术讨论社区