我对C记忆概念不太熟悉。我试着找一个解决方案,但找不到一个。
我只是想在C中创建动态数组。我尝试以这种方式创建它,同时尝试检查地址是否连续。程序运行正常。
然而,在语句system("pause")
之后我遇到了分段错误。我也尝试使用调试器进行调试,没有运气!我正在使用Dev CPP。
有人可以指导我吗?
#include<stdio.h>
#include<stdlib.h>
main()
{
int a[0], *ptr, i;
printf("%d", sizeof(a[0]));
a[0]=1;
for(i=1;i<10;i++)
{
ptr=(int *) malloc(sizeof(int));
printf("Enter a[%d]: ", i);
a[i]= *ptr;
scanf("%d", &a[i]);
}
i=0;
while(i<10)
{printf("\n%u", &a[i++]);}
free(ptr);
system("pause");
}
答案 0 :(得分:3)
int a[0]
没有分配任何空间(宽度为0)
然而你在这一行写到:
a[0]=1;
你还假设它有10个元素:
while(i<10)
{printf("\n%u", &a[i++]);}
free(ptr);
实际上,因为这只是堆栈内存,所以你只需要写入堆栈的另一部分。例如,您可以覆盖ptr
的值。通常这可能会被检测到,直到堆栈被解开并且其中一部分明显被破坏。这里的堆栈在system("pause")
之后立即展开,当主要返回时。
(另外,如果您对ptr
的写入覆盖了a
,则无法确定free
是否做了任何合理的事情。)
要分配10个整数数组,请使用以下语法:
int a[10];
然后你可以使用[0]到[9]。但是当你尝试读/写[10]时,这是C不要指望任何保护你的东西。
答案 1 :(得分:2)
您的代码中存在许多问题。
这只是一个开始。
答案 2 :(得分:1)
int a[0], ...;
...
a[0]=1;
你正在写出界限。这是未定义的行为。
答案 3 :(得分:1)
首先,a[0]
应该是a[10]
,因为您尝试使用它的方式。其次,只是malloc到指针,它基本上是一个数组。虽然你不需要在for循环中执行它。你可以说ptr = malloc(10 * sizeof(int));
,你会很好。不需要施放它。您可以通过ptr[9]
等数组下标访问它的元素。
答案 4 :(得分:0)
嗯,你与a
的交易是史诗般的:
int a[0]; // no-items array
...
a[0]=1; // WHAT?
for(i=1;i<10;i++)
{
ptr=(int *) malloc(sizeof(int));
a[i]= *ptr; // a was int or pointer? And A[9]?
}
答案 5 :(得分:0)
几个问题:1)你期望你的数组长10个元素,但你用0表示它,并使它成为一个指针数组;
int *a[10];
然后
a[i] = (int*)malloc(sizeof(int));
并且在释放时;
free(a[i]);