3

我对 C 内存概念不是很有经验。我尝试寻找解决方案,但找不到。

我只是想在 C 中创建动态数组。我试图以这种方式创建它,同时尝试检查地址是否连续。程序运行良好。

但是,我在语句之后遇到了分段错误system("pause")。我也尝试使用调试器进行调试,但没有运气!我正在使用开发 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");
}
4

6 回答 6

3

int a[0]

没有分配任何空间(其宽度为 0)

然而你在这一行写信给它:

a[0]=1;

您还假设它在这里有 10 个元素:

while(i<10)
{printf("\n%u", &a[i++]);}
free(ptr);

实际上,由于这只是堆栈内存,因此您只是在写入堆栈的另一部分。例如,您可以覆盖ptr. 通常,在堆栈展开并且其中的一部分明显损坏之前,这可能不会被检测到。在这里system("pause"),当 main 返回时,堆栈在 之后立即展开。

(此外,如果ptr被您的写入覆盖,您a无法确定这样free做是否合理。)

要分配一个 10 整数数组,请使用以下语法:

int a[10];

然后你可以使用 a[0] 到 a[9]。但这是 C,当您尝试读/写 a[10] 时,不要指望有任何东西可以保护您。

于 2013-10-20T00:56:06.110 回答
2

你的代码有很多问题。

  1. 整数 [0]。您正在定义一个由 0 个元素组成的数组。在 C 中这是行不通的。您不能执行 a[0]=1 ,因为它仅在 a 是 1 个或多个元素的数组时才有效。
  2. a[i]=*ptr 会变得更糟。这里有 2 个问题,如上所述 a[1]、a[2] 等不存在。第二个问题是您分配了 ptr 但分配了 *ptr 可能有一些垃圾。

这只是一个开始。

于 2013-10-20T00:57:21.890 回答
1
int a[0], ...;
...
a[0]=1;

你写的越界。这是未定义的行为。

于 2013-10-20T00:55:58.093 回答
1

首先,您a[0]应该以a[10]您尝试使用它的方式为准。其次,只是 malloc 到指针,它基本上是一个数组。尽管您不需要在 for 循环中执行此操作。你可以说ptr = malloc(10 * sizeof(int));,你会很好。不需要投。您可以通过数组下标访问它的元素,例如ptr[9].

于 2013-10-20T00:57:43.183 回答
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]?
}
于 2013-10-20T00:56:13.677 回答
0

几个问题: 1)您期望您的数组长度为 10 个元素,但您用 0 声明它,并使其成为指针数组;

int *a[10];

然后

a[i] = (int*)malloc(sizeof(int));

和释放时;

free(a[i]);
于 2013-10-20T00:56:32.523 回答