在c中使用指针生成数组

在c中使用指针生成数组,c,segmentation-fault,C,Segmentation Fault,我对使用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; } #包括 int main() { int*i; scanf(“%d

我对使用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;
}
#包括
int main()
{
int*i;
scanf(“%d”,i);i++;
而(1){
scanf(“%d”,i);
如果(*i==*(i-1)){
中断;}
printf(“%d\n”,*i);
i++;
}
返回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;
}
#包括
#包括
int main()
{
int*A,n;
printf(“\n输入数组大小:”;//读取数组大小
scanf(“%d”和“&n”);
A=(int*)malloc(sizeof(int)*n);//为数组分配内存
int i=0;
对于(i=0;i

希望这对你有所帮助

这里只是一点解释。 您在此处将
i
变量声明为指针:

int *i;
指针不指向任何地方,而是包含一个随机值。下面的操作尝试在指针指向的内存中写入一个整数。由于它指向一个未定义的位置,因此此操作的结果是不可预测的。它可能崩溃,或者在内存中写入,这可能会在以后产生意外行为,或者只是工作。在任何情况下,它都会导致
内存损坏

scanf("%d",i);i++;
i++
语句实际上增加了指针的值,使其指向内存中的下一个位置,这也是无效的。等等

根据程序的目的,您可以通过多种方式解决此问题。i、 e.如果只需要一个整数,可以执行以下操作:

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]);
或者将“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(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("%d\n",*i);  @@ reads integer from memory using uninitialized pointer  I.E. undefined behavior
            i++;
        }
        return 0;
    }
    
    #包括
    内部主(空)
    {
    int*i;@@n已声明未初始化的指针
    scanf(“%d”,i);@@n访问随机内存,即未定义的行为
    i++;
    而(1)
    {
    scanf(“%d”,i);@@n访问随机内存,即未定义的行为
    if(*i==*(i-1))@@n使用未初始化的指针(即未定义的行为)读取两个连续的整数
    {
    打破
    }
    printf(“%d\n”,*i);@@n使用未初始化的指针(即未定义的行为)从内存中读取整数
    i++;
    }
    返回0;
    }
    


    seg故障事件之所以会发生,是因为程序访问不属于自己的内存而导致的未定义行为。

    数组是什么?能否解释一下程序最后应该做什么?这是因为您的代码试图访问未分配的内存地址。您有一个指针变量
    i
    ,但它指向哪里呢?也许您应该先阅读?指向有效数据的指针不是数组,未初始化的指针也没有用。当您否决某个答案时,请务必发表评论,说明该答案被否决的原因。