2012-02-04 5 views
0

Я пытаюсь понять основы структуры в C Пожалуйста, обратите внимание Вот мой код: я запускаю код блоков на ОС Windows 7ссылка Структура по символьной строки

#include<stdio.h> 
struct xx 
{ 
    int a; 
    char x[10]; 
}; 

int main() 
{ 


struct xx *p; 
p->a=77; 

    p->x[10] = "hello"; 
     printf("\n %d",p->a); 
        printf("\n %s ",p->x); 
return 0; 
    } 

В строке, где я пытаюсь сделать print p-> x Программа вылетает ! Вторая проблема: Верно ли, что когда я не инициализирую целые целые структуры, они по умолчанию равны нулю И строки, не инициализированные (char star), по умолчанию имеют значение null, если внутренняя структура Третий вопрос: Я попытался изменить строку на

p->x= "hello"; 

Я получаю ошибку даже тогда !! Я даже пытался изменить

char tem[] = "hello"; 

    p->x[]= tem[]; 

Тем не менее я получаю ошибку

p->x= tem[]; 

Эта линия также дает ошибку даже это

char *tmp = "hello"; 

    p->x= tem[]; 

даже это

char *tmp = "hello"; 

    p->x[]= tem[]; 

даже эта линия ошибка

char *tmp = "hello"; 

    p->x[10]= tem[]; 

Вы можете закрыть этот вопрос, но поясните мне! Как инициализировать массив символов в структуре

ответ

0

Ваша главная проблема в том, что указатель р, который должен указывать на структуру в памяти, не указывает на структуру. Указатель p просто содержит случайный мусор, и у вас нет структуры для его указания.

Самый простой способ исправить это, чтобы создать переменную структуры, и пусть р точка к нему:

struct xx the_actual_struct; 
struct xx *p = &the_actual_struct; 

Кроме того, вы не можете присвоить строку, например, как поле х в структуре, с оператором нормального присваивания =. Вы должны использовать STRCPY:

strcpy(p->x, "hello"); 
2

Вы должны выделить память для ваших struct, прежде чем пытаться использовать его, используя malloc():

struct xx *p = NULL; 
p = malloc(sizeof(struct xx)); 
if (!p) { 
    fprintf(stderr, "could not allocate memory for pointer p\n"); 
    exit(-1); 
} 
p->a = 77; 
... 
free(p); /* do this when you no longer need pointer p */ 

Насколько доступа x, это лучше всего скопируйте строку, например:

#include <string.h> 
... 
if (strncpy(p->x, "blahblah", 4)) 
    fprintf(stdout, "p->x: %s\n", p->x); /* p->x: blah */ 
else { 
    fprintf(stderr, "could not copy string to p->x\n"); 
    exit(-1); 
} 

Попробуйте использовать strncpy(), где можно, как вручную, с указанием количества символов может помочь в обеспечении привычку проверки границ, помогая избежать переполнения.

Например, давайте попробуем копируйте const char * в p->x, который бывает больше, чем то, что p->x может содержать:

#include <assert.h> 

#define MAX_LENGTH 10 

struct xx { 
    int a; 
    char x[MAX_LENGTH]; 
}; 
... 
const char *foo = "blahblahblah"; 
assert(strlen(foo) < MAX_LENGTH); /* code should fail here */ 
if (strncpy(p->x, foo, strlen(foo) + 1)) 
    ... 

При запуске этого assert() должен отключиться:

Assertion failed: (strlen(foo) < MAX_LENGTH), function main, file test.c, line xyz. 
Abort trap: 6 

Как только foo сокращен до девяти или менее символов (вам нужен этот десятый символ для терминатора \0, помните!) Код должен работать должным образом.

Так что используйте strncpy() и проверьте свои границы!

+0

ya true: но почему междоменный доступ не является ошибкой! –

+0

Что означает «промежуточный доступ»? –

+0

Я имею в виду, что целое число внутри структуры не дает ошибки –

0

У вас есть пара проблем;

1) Вы путаете указатель на структуру с фактическим «экземпляром» структуры. р является указателем, но не указывает ни на что, вы должны сделать

p = malloc(sizeof(struct xx)); 

на линии после объявления его, чтобы она указывала на фактическое выделенной памяти. Вы должны использовать free() в этой памяти, как только вы ее закончите.

Альтернативой было бы сделать р фактический структура вместо указателя, изменяя его

struct xx p; 

(обратите внимание на отсутствие *) составит р фактический структура и доступ членов с помощью точек (структура доступ) вместо p-> x (доступ указателя). Это также (в отличие от памяти, которую вы выделяете с помощью malloc), выделенной локально для вашей функции и автоматически «исчезает», когда она выходит из области действия, когда ваша функция существует.

Кроме того, строки в C также являются указателями, поэтому присвоение «привет» чему-то не будет автоматически копировать строку. Вы должны использовать strcpy(p->x, "hello");, чтобы скопировать данные в массив символов.

И, наконец, нет, почти ничего не будет обнулено в C автоматически. Предположим, что вы должны инициализировать все, и вы будете в безопасности и не должны помнить, что сделано автоматически, а не.

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