我是使用C
#include <stdio.h>
int main()
{
int *i;
scanf("%d",i);i++;
while(1){
scanf("%d",i);
if(*i==*(i-1)){
break;}
printf("%dn",*i);
i++;
}
return 0;
}
我继续遇到此错误
命令失败:./a.out 分割故障
我想您想创建一个数组并向其读取数据,然后动态使用指针显示。
#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;
}
希望这个帮助。!!
这里的一些解释。您将i
变量声明为指针:
int *i;
指针在任何地方都没有指向并包含一个随机值。以下操作试图在指针指向的内存中编写整数。由于它指向不确定的位置,因此该操作的结果是不可预测的。它可能会崩溃,或者可以在内存的位置写入,该内存可能以后会产生意外行为,或者只是工作。无论如何,它会导致memory corruption
。
scanf("%d",i);i++;
i++
语句实际上增加了指针的值,因此它指向内存中的下一个位置,这也无效。等等。
根据程序的目的,您可以通过多种方式解决此问题。即,如果您只需要一个整数才能使用,则可以执行以下操作:
int i;
scanf("%d", &i); // use an address of 'i' here
...
printf("%d", i);
现在,您可以在正常的算术操作中使用" i"。或者,如果您需要整数数组,则可以执行关注器:
int i = 0;
int a[mysize];
scanf("%d", &a[i]);
i++; // do not forget to check 'i' against 'mysize'
...
printf("%d", a[i]);
或将"我"作为指针:
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)
;
编辑@@
的编辑清理代码格式后:
- 始终如一地缩进代码
- 因此,它遵循公理:每行只有一个语句,并且(最多)每个语句声明一个变量。
那么,很明显,代码包含未定义的行为。(请参阅代码中的@@评论)
@@每个包含未定义行为的陈述可能会导致SEG故障事件。
#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("%dn",*i); @@ reads integer from memory using uninitialized pointer I.E. undefined behavior
i++;
}
return 0;
}
通过访问程序不拥有的内存的未定义行为,就是为什么发生SEG故障事件的原因。