使用c中的指针创建数组

时间:2017-09-30 14:33:57

标签: 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;
}

我继续收到此错误

  

命令失败:./ a.out   分段错误

3 个答案:

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

编辑前缀为@@

清理代码格式后

  1. 始终缩进代码
  2. 所以它遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。
  3. 然后很明显代码包含未定义的行为。 (参见代码中的@@注释)

    @@包含未定义行为的每个语句都可能导致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事件的原因。