2015-10-12 1 views
-1

Я программировал с GCC некоторое время , но я решил начать работу с Visual Studio, потому что это удобно. В любом случае проблема заключается в том, что в Visual Studio динамические массивы действительно не работают , как в GCC, поэтому я использовал malloc.Динамические массивы Visual Studio в C

При печати 1-го присвоенного значения я получу правильный ответ. Однако следующие значения будут неправильными, второе значение всегда будет неправильным, третье значение будет неправильным, и я не могу понять, почему.

Например, при вставке 1,2,3 и попытаться напечатать 2-е место, он дает 5.

int main(void) 
{ 
K1(); 
printf("%d\n", p1+1); 
return 0; 
] 

С p1 [I] аварий программы. p1, является INT *

void K1(void) 
{ 

int i; 

printf("n1"); 
scanf_s("%d", &n1); 

p1 = (int*)malloc(sizeof(int) * n1); 

for(i=0;i<n1;i++) 
{ 
    scanf_s("%d", &p1 + i*sizeof(int)); 
} 
} 

Я не могу понять, в чем проблема.

+0

Всегда проверяйте возвращаемые значения 'scanf' семейных функций. – user694733

+0

Подумайте о '& p1 + i * sizeof (int)' Если вы указали указатель, почему нужно добавить его размер ....? – LPs

+0

Это еще одна попытка, сначала это был просто malloc (n1) – s3v3ns

ответ

4

Эта линия:

scanf_s("%d", &p1 + i*sizeof(int)); 

должно быть просто:

scanf_s("%d", p1 + i); 

или еще лучше:

scanf_s("%d", &p1[i]); 


У вас также есть ошибка в вашем printf заявлении здесь:

printf("%d\n", p1+1); 

Это должно быть:

printf("%d\n", *(p1+1)); 

или еще лучше:

printf("%d\n", p1[1]); 

Также отметим, что you should not cast the result of calls such as malloc in C, так:

p1 = (int*)malloc(sizeof(int) * n1); 

должно быть:

p1 = malloc(sizeof(int) * n1); 

или еще лучше:

p1 = malloc(n1 * sizeof(*p1)); 
+0

Почему вы говорите '& p1 [i]' лучше, чем 'p1 + i'? – Downvoter

+0

@PaulR Да, scanf_s ("% d", & p1 + i * sizeof (int)); является случайностью от копирования. А я чувствую себя глупо, задавая этот вопрос, не могу поверить, что не видел, что – s3v3ns

+0

@cad: Я бы сказал, что нотация массива обеспечивает более четкое представление о намерениях программиста, но это вопрос личных предпочтений/стиля, и я знаю, что некоторые люди все еще любят думать с точки зрения указателей и смещений. –