一个小而奇怪的<segmentation fault =“”> </segmentation>

时间:2013-10-20 00:48:48

标签: c arrays

我对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");
}

6 个答案:

答案 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)

您的代码中存在许多问题。

  1. int a [0]。您正在定义一个包含0个元素的数组。在C中这不起作用。你不能做[0] = 1,因为它只有在a是1个或更多元素的数组时才有效。
  2. a [i] = * ptr会变得更糟。这里有2个问题,如上所述a [1],a [2]等不存在。第二个问题是你分配了ptr但是分配了可能有一些垃圾的* ptr。
  3. 这只是一个开始。

答案 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]);