void initstr(char **strarr)
{
int i;
strarr = (char**) malloc(sizeof(char*) * 14);
for (i = 0; i < 14; i++)
*(strarr+i) = malloc(sizeof(char) * 70);
strcpy(strarr[0], ":(");
...
strcpy(strarr[13], ":(");
for (i = 0; i < 14; i++)
*(strarr+i) = (char*) realloc(*(strarr+i), sizeof(char) * (strlen(strarr)+1));
fprintf(stdout, *strarr); // в этом месте работает
}
void voivoid(void)
{
char **strarr;
initstr(strarr);
fprintf(stdout, *strarr); // а в этом - нет
}
Очередная проблема с выделением памяти на каноническом Си
А точнее, с инициализацией двумерного массива.
Видимо имя локальной переменной скрывает имя глобальной. Можно например использовать разные префиксы для локальных и для глобальных имен (это на любителя). В целом два имени strarr дают такую проблему.
Вот так, например, всё работает отлично:
Код:
char** initstr ()
{
char **strarr;
....
return strarr;
}
void voivoid (void)
{
char strarr**;
strarr = initstr();
fprintf(stdout, *strarr);
}
{
char **strarr;
....
return strarr;
}
void voivoid (void)
{
char strarr**;
strarr = initstr();
fprintf(stdout, *strarr);
}
Но тем не менее, я очень хотел бы узнать, как сделать это через аргумент. Пробовал также изощрения типа initstr(&(*strarr)), но не помогло.
Код:
void initstr(char **& strarr)
{
int i;
strarr = (char**) malloc(sizeof(char*) * 14);
for (i = 0; i < 14; i++)
*(strarr+i) = (char*) malloc(sizeof(char) * 70);
strcpy(strarr[0], ":(");
strcpy(strarr[13], ":(");
for (i = 0; i < 14; i++)
*(strarr+i) = (char*) realloc(*(strarr+i), sizeof(char) * (strlen(strarr)+1));
fprintf(stdout, *strarr);
}
void voivoid(void)
{
char **strarr;
initstr(strarr);
fprintf(stdout, *strarr);
}
{
int i;
strarr = (char**) malloc(sizeof(char*) * 14);
for (i = 0; i < 14; i++)
*(strarr+i) = (char*) malloc(sizeof(char) * 70);
strcpy(strarr[0], ":(");
strcpy(strarr[13], ":(");
for (i = 0; i < 14; i++)
*(strarr+i) = (char*) realloc(*(strarr+i), sizeof(char) * (strlen(strarr)+1));
fprintf(stdout, *strarr);
}
void voivoid(void)
{
char **strarr;
initstr(strarr);
fprintf(stdout, *strarr);
}
или этого:
Код:
void initstr(char *** strarr)
{
int i;
*strarr = (char**) malloc(sizeof(char*) * 14);
for (i = 0; i < 14; i++)
*(*strarr+i) = (char*) malloc(sizeof(char) * 70);
strcpy((*strarr)[0], ":(");
strcpy((*strarr)[13], ":)");
for (i = 0; i < 14; i++)
*(*strarr+i) = (char*) realloc(*(*strarr+i), sizeof(char) * (strlen((*strarr))+1));
fprintf(stdout, **strarr);
}
void voivoid(void)
{
char **strarr;
initstr(&strarr);
fprintf(stdout, strarr[13]);
}
{
int i;
*strarr = (char**) malloc(sizeof(char*) * 14);
for (i = 0; i < 14; i++)
*(*strarr+i) = (char*) malloc(sizeof(char) * 70);
strcpy((*strarr)[0], ":(");
strcpy((*strarr)[13], ":)");
for (i = 0; i < 14; i++)
*(*strarr+i) = (char*) realloc(*(*strarr+i), sizeof(char) * (strlen((*strarr))+1));
fprintf(stdout, **strarr);
}
void voivoid(void)
{
char **strarr;
initstr(&strarr);
fprintf(stdout, strarr[13]);
}
А вот первый способ (для справки) не каноничен, т.к. на Си не поддерживаются ссылки (хотя говорят, что в C99 можно) - только указатели :rolleyes:
Прогрессивные люди, которые не теряли время и ушли в Си++ часто этого не знают. Мой препод, например, не знал.