Указатель структуры - PullRequest
       1

Указатель структуры

1 голос
/ 30 марта 2011
#include<stdio.h>
int c;
int main()
{
        struct abc{
        int *a;
        char *ch[10];
        };
        struct abc obj1;
        struct abc *obj;
        obj = & obj1;
        scanf("%d",obj->a);
        printf("\nY");
        scanf("%s",&obj->ch);
        printf("\nY");
return 0;
}

Я использую VIM-редактор и компилятор Gcc на fedora. Я получаю ОТСУТСТВИЕ СЕГМЕНТАЦИИ (ОСНОВАНИЕ ЯДРА ??) // Что это значит ??

Ответы [ 4 ]

5 голосов
/ 30 марта 2011

«Ошибка сегментации» означает, что ваша программа пыталась получить доступ к памяти, которой она не была разрешена.В вашей программе есть несколько ошибок указателя и инициализации.

Я думаю, вы хотите, чтобы ваш массив был char ch[10], а не char *ch[10].Вам также нужно изменить вызов scanf() на соответствие: scanf("%s", obj->ch);.

То же самое относится к вашему полю a.Вероятно, он не должен быть указателем, и вы должны передать указатель на scanf():

scanf("%d", &obj->a);
2 голосов
/ 30 марта 2011

я получаю ОТСУТСТВИЕ СЕГМЕНТАЦИИ (ОСНОВНОЕ ЯДРО ??) // Что это значит ??

Переменная, которая нарушает доступ к памяти, приводит к ошибке сегментации.

scanf("%d",obj->a);

int *a; - член структуры a является неинициализированным указателем, но пытается передать данные в местоположение, на которое он указывает.Причиняя вам ошибку сегментации.

 obj->a = malloc(sizeof(int)) ;

Теперь вы можете взять ввод для a местоположения наведения.

 scanf("%d", &(obj->a) );

С типом операций ввода, которые вы выполняете, определение структурыне нужны необработанные указатели -

struct abc{
    int *a;         // Change this to int a; or make a point to a valid memory location
    char *ch[10];   // Change this to char ch[10]; or initialize it with pointers pointing to a valid memory locations
                    // and then take input on to pointer pointing location.
};

Обратите внимание на разницу между ними -

int a  ;  // Can take input directly to "a"
int *a ;  // First "a" must point to a valid memory location that can hold an int
          // Then, can take input to "a" pointing location
1 голос
/ 30 марта 2011

Расширение ответа Карла: char *ch[10] создает массив из 10 указателей на персонажа. То, что вы хотите, это массив из 10 символов.

0 голосов
/ 30 марта 2011

Ваш код вызывает неопределенное поведение.

Вы должны иметь char ch[10]; и использовать scanf с предустановленной шириной, чтобы избежать переполнения

scanf("9%s",&obj->ch); 

Подробнее: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

Структура определена так, чтобы иметь указатель на int, который вы никогда не инициализируете, следовательно, указывает на случайное местоположение, следовательно, записываете в место памяти, которое вам не принадлежит, следовательно, UB.Либо переключите это на локальную переменную int a или malloc() целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...