2014-01-31 6 views
1

У меня возникла проблема с пониманием концепции распределения динамической памяти, у меня есть код, который сталкивается с segfault, возможно, у кого-то может быть некоторое понимание?динамические строки в структуре

#include <stdio.h> 
#include <stdlib.h> 


typedef struct tName 
{ 
    char **stringA; 
    int capacity; 
} tName; 

tName *createTName(int length); 
tName *destroyTName(tName *l); 

int main(void) { 
    tName *ll = createTName(10); 
} 

tName *createTName(int length) { 
    tName *temp; 
    int i; 
    temp->capacity = length; 

    temp->stringA= (char**) malloc(sizeof(char*) * length); 
    for(i=0;i<length;i++) 
     temp->stringA[i] = (char*) malloc(sizeof(char)*50); 

    return temp; 
} 

Когда я звоню в эту программу, я получаю segfault, может ли кто-нибудь помочь мне, пожалуйста?

+1

FYI: Не выдавайте результат 'malloc'. – Barmar

+0

@ Бармар: Почему бы и нет? В C++ вы даже вынуждены использовать возвращаемое значение. Я думаю, что нет проблем с кастингом. – maja

+0

maja: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – hivert

ответ

4

Ваша проблема здесь:

temp->capacity = length; 

Вы asigning значение переменной, которая не имеет памяти еще. Вы должны выделить память для структуры.

Используйте это:

tName *temp = malloc(sizeof(tName)); 

Если вы только писать tName *temp, компилятор выделяет только 4 байта (или 8 в 64-битных системах) для указателя. Но он не будет размещать momory, на который указывает указатель.

Другая проблема заключается в таНос, который выделяет память для строки - это должно быть так:

temp->stringA = malloc(length+1); 

Кулак всего, вам не нужно умножить его sizeof(char*) (что опять-таки будет 4 или 8 байтов), но с sizeof(char). Для параметра Variabletype char всегда требуется 1 байт, поэтому вам не нужно его полностью отключать.

Но вы не должны забывать выделять один лишний байт для строки, если вы хотите использовать строковые операции. Этот байт необходим для создания Ascii-0, который указывает конец строки.

Если вы забыли про этот байт, программа может привести к странному выходу и даже в sefgaults.

И об этом цикле:

for(i=0;i<length;i++) 
     temp->stringA[i] = (char*) malloc(sizeof(char)*50); 

Я действительно не знаю, что вы хотите достичь с ним, вы можете добавить больше информации?

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