2013-02-12 2 views
0
#include <stdio.h> 
#include <stdlib.h> 
main() 
{ 
    typedef struct 
    { 
     int info; 
     struct strc* next_ptr; 
    }strc; 
    strc* strcVar[5]; 
    strcVar = malloc(sizeof(strc) * 5); 
    strcVar[0]->info = 1; 
    printf(" All is well "); 
} 
+2

А компилятор говорит? Или как вы знаете, что есть ошибка? –

+0

Вы должны узнать о различии между структурами и указателями на структуры. –

ответ

2

strcVar является (локальным) именем массива, вы не можете назначить ему указатель. Вы, наверное, хотели:

strc* strcVar; 
... /* and later */ 
strcVar[0].info = 1; 

Может быть, вы хотели массив указателей на struct strc, то ответ на Vaughn Катон поможет.

2

Эта линия является неправильным и ненужным:

strcVar = malloc(sizeof(strc) * 5); 

вместо этого вы могли бы использовать:

{ 
    int i=0; 
    for (;i!=5; ++i) { 
    strcVar[i] = malloc(sizeof(strc)); 
    } 
} 
2

Вы не можете присвоить массив из malloc - это один или другой. Если вы объявили массив из пяти указателей, память для них уже выделена. Если вы должны использовать malloc, используйте указатель на указатель вместо массива. В противном случае, выделить отдельные элементы с malloc, а не массив:

strc* strcVar[5]; 
strcVar[0] = malloc(sizeof(strc)); 
+0

Извините, опечатка '# include' была моей ошибкой при редактировании его кода. – koopajah

1

исправить код:

#include<stdio.h> 
#include<stdlib.h> 
void main() 
{ 
    typedef struct 
    { 
     int info; 
     struct strc* next_ptr; 
    }strc; 
    strc* strcVar; 
    strcVar = malloc(sizeof(strc) * 5); 
    strcVar[0].info = 1; 
    printf(" All is well "); 
} 
2

Изменить

strc* strcVar[5]; 

в

strc* strcVar; 
strcVar = malloc(sizeof(strc) * 5); 
strcVar[0].info = 1; 

ИЛИ

Изменить

strc* strcVar[5]; 
strcVar = malloc(sizeof(strc) * 5); 
strcVar[0]->info = 1; 

к

strc strcVar[5]; 
strcVar[0].info = 1; 
+0

Вызов неинициализированного указателя приводит к UB и, скорее всего, сбой, вы не хотите давать первый совет для OP. – 2013-02-12 13:52:21

+0

@ H2CO3 - К сожалению, это слишком удобно с помощью клавиши удаления! –

0

В любом массиве базовый адрес является константным указателем. Вы не можете его изменить.

Предположим, если у вас есть int [5];

Здесь a является базовым указателем на весь массив, и вы не можете его изменить.

Это относится ко всем массивам.

Смежные вопросы