اعلان و تعریف متغیر به فرم x صحیح نیست.
شما متغیر عددی i را مقدار دهی اولیه نکردین. initialize
الان به دلیل اینکه متغیر i مقدار اولیه نامعتبر Garbage Value دارد تعریف آرایه به طول i صحیح نیست.
به نظر میرسه شما قصد تعریف آرایه ای با طول نامعین در زمان كامپایل دارید که قرار است در زمان اجرا طول آن معین شود.
برای چنین کاری باید از اختصاص حافظه پویا Dynamic Memory Allocation استفاده کنید.
به این شکل که با تعریف آرایه به فرم اشاره گر عددی و صدا زدن تابع malloc حافظه ای به طول i برای آن رزرو کنید.
حدس من اینه که چنین کدی کار میکنه برای شما
int i;
scanf("%d",&i);
int *x=malloc (sizeof(int) *i);
پس از اعمال چنین تغییری برای اختصاص حافظه به آرایه به صورت پویا حالا نوبت به پر کردن آن با تابع scanf که در کد خودتون انجام دادین.
استفاده از تابع malloc نیاز به هدر <include <stdlib.h# هم دارد.
[ویرایش]
یک روش دیگه استفاده از مفهوم VLA است که تنها در زبان C مجاز است و در ++C نه.
int i ,j;
printf("please enter array length: ");
scanf("%d", &i);
int x[i];
for( j = 0 ; j < i ; j++)
{
scanf("%d", &x[j]);
}
و نکته دیگر اینکه نمیتوان چنین آرایهای را در زمان تعریف مقدار دهی اولیه کرد یعنی این دستور مجاز نیست.
int x[i]={0};
[ویرایش ۲]
با هر بار صدا زدن تابع ()malloc باید مقدار خروجی برای صحت اختصاص حافظه پویا بررسی شود.
و هر اختصاص حافظه باید شامل رهایی هم باشد. باپایان یافتن نیاز به استفاده از حافظه با صدا زدن free حافظه آزاد کنید.
در لیست آرگومان های تابع main حتمن void قرار دهید.
ویرایش نهایی برنامه:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
scanf("%d",&i);
int *x = malloc(sizeof(int) *i);
if (!x){
printf("Memory alocation failed ...\n");
///handle failed case
}
free(x);
return 0;
}