2013-04-14 2 views
0

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

typedef char* (*Encryptor3)(char*, char); 
char** encryptToString(char** input,int length,int first,Encryptor3 encryptor) 
{ 
int i=0; 
char** output=(char **)malloc(sizeof(char*)*length); 
for(i=0;i<length;i++){ 
    output[i]=(char *)malloc(sizeof(char)*(100+1)); 
} 
output[0]=encryptor(first,input[0]); 
output[1]=encryptor(first,input[1]); 

for(i=2; i<length ; i++) 
{ 
    output[i]=encryptor(output[i-2],input[i]); 
} 
return output; 
} 

int main() 
{ 
    char plain[] = {'p','l','a','i','n','t','e','x','t'}; 
    char** outputS = encryptToString(plain, 9, "test", idenString); 
    int i; 
    for(i=0; i<9; i++) 
     printf("%s\n", outputS[i]); 
    for(i=0; i<9; i++) //deallocating my array of strings 
     free(outputS[i]); 
    free(outputS); 
    return 0; 
} 

строка "free (outputS [i]);" приведет к сбою программы, и я получу обычную ошибку: «myp.exe перестает работать».

+0

Почему вы передаете '' test '' как параметр 'int'? – icktoofay

+0

'output [i] = шифр (выход [i-2], вход [i]);' утечка памяти. Кроме того, как распределяется возвращаемое значение 'encryptor'? –

+4

Эти строки 'output [0] = encryptor (во-первых, вход [0]);' (и т.д.) заменяют * вашу переменную, поэтому она не использует пространство 'malloc' – Dave

ответ

1

Вместо

output[...]=encryptor(...); 

сделать:

strcpy(output[...], encryptor(...)); 

Это предполагает буфер, используемый encryptor() статична.

Также убедитесь, что строка, возвращаемая encryptor(), не больше того, что вы выделили указателям, на которые ссылается output, то есть 100 символов, исключая завершающее нулевое завершение.

+0

Я не исключал ответа, это хорошо! он работает как шарм , вы даже заметили другие вещи, которые я сделал неправильно. спасибо! (изменена первая переменная от int до char * и из выхода [...] = encryptor (...); в strcpy (output [...], encryptor (...));) –

+0

@ A'merMograbi : Как вам показалось, что ответ полезен, вы можете его принять (нажав его восклицательный знак), и если вам понравилось, вы также можете его перенести ... ;-) – alk

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