我是新手使用c而我正在尝试制作一个使用指针创建数组的程序,
#include <stdio.h>
int main()
{
int *i;
scanf("%d",i);i++;
while(1){
scanf("%d",i);
if(*i==*(i-1)){
break;}
printf("%d\n",*i);
i++;
}
return 0;
}
我继续收到此错误
命令失败:./ a.out 分段错误
答案 0 :(得分:0)
我认为你想创建一个数组并向其读取数据,然后动态地使用指针显示它。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *A, n;
printf("\n Enter the size of array : "); // Reading the size of array
scanf("%d",&n);
A = (int*) malloc(sizeof(int) * n); // Allocating memory for array
int i = 0;
for(i = 0; i < n; i++) // Reading data to array
scanf("%d", (A+i));
// Operations on array
for(i = 0; i < n; i++) // Printing array
printf("%d ", A[i]);
return 0;
}
希望这有帮助。!!
答案 1 :(得分:0)
这里只是一些解释。
您将i
变量声明为指针:
int *i;
指针不指向任何位置并包含随机值。以下操作尝试在指针指向的内存中写入整数。由于它指向未定义的位置,因此该操作的结果是不可预测的。它可能崩溃,或者可以在内存中写入,这可能会在以后产生意外行为,或者只是工作。在任何情况下,它都会导致memory corruption
。
scanf("%d",i);i++;
i++
语句实际上增加了指针的值,使其指向内存中的下一个位置,这也是无效的。等等。
根据程序的目的,您可以通过多种方式解决此问题。即如果您只需要一个整数,则可以执行以下操作:
int i;
scanf("%d", &i); // use an address of 'i' here
...
printf("%d", i);
现在您可以使用&#39; i&#39;然后在正常的算术运算中。或者如果您需要一个整数数组,可以执行以下操作:
int i = 0;
int a[mysize];
scanf("%d", &a[i]);
i++; // do not forget to check 'i' against 'mysize'
...
printf("%d", a[i]);
或者有&#39; i&#39;作为指针:
int a[mysize];
int *i = a;
scanf("%d", i);
i++; // do not forget to check 'i' against 'mysize'
...
printf("%d", *i);
甚至让malloc在内存中分配数组,如下所示:
int *a = malloc(sizeof(int) * mysize);
int *i = a;
scanf("%d", i);
i++;
...
printf("%d", *i);
请注意,在某些时候,您需要在最后一个示例中free
内存。因此,您最好将指针指向数组的开头,以便能够执行free(a)
;
答案 2 :(得分:-1)
编辑前缀为@@
清理代码格式后:
然后很明显代码包含未定义的行为。 (参见代码中的@@注释)
@@包含未定义行为的每个语句都可能导致seg fault事件。
#include <stdio.h>
int main( void )
{
int *i; @@ uninitialized pointer declared
scanf("%d",i); @@ accessing random memory I.E. undefined behavior
i++;
while(1)
{
scanf("%d",i); @@ accessing random memory I.E. undefined behavior
if(*i==*(i-1)) @@ reads two consecutive integers using uninitialized pointer I.E. undefined behavior
{
break;
}
printf("%d\n",*i); @@ reads integer from memory using uninitialized pointer I.E. undefined behavior
i++;
}
return 0;
}
来自访问程序不拥有的内存的未定义行为是发生seg fault事件的原因。