2013-11-24 7 views
0

После других запросов, которые я нашел на этом сайте, я пытаюсь напечатать массив указателей на символы (строки), используя ** двойного указателя следующим образом:Печать массива указателей, используя двойной указатель

char *input=malloc(128), *color[7]={0}, **colors=malloc(8); 

fgets(input, 128, stdin); 
sscanf(input, "%s%s%s%s%s%s", &color[0], &color[1], &color[2], &color[3], &color[4], &color[5]); 
color[6]=NULL; 
colors=color; 

while(*colors) 
printf("%s ", colors++); 

Выход, полученный мной из вышеприведенного, кажется, удушает каждую строку ввода до 4 байтов, а затем переполняется, если ее больше четырех, потому что, если я набираю: «черное красное золото белого зеленого цвета», например, я получаю : «blacred red goldwhitgreeblue goldwhitgreeblue whitgreeblue greeblue blue». Очень расстраивает.

Я пробовал разыменовывать цвета ++, как я видел в других примерах, но это приводит к сбою программы. В конечном счете, printf предназначен только для отладки. Это часть функции char ** (void), которую я пытаюсь создать, чтобы назначить то, что я пытаюсь напечатать, для локальной переменной типа char **. Как я могу это исправить?

+0

'таНос)' не магия ... –

+0

Ладно, круто (. Не то, чтобы я когда-либо думал. – mosdellg

+0

Ну, вы использовали его, как если бы это было так ... –

ответ

2

Когда вы

char **colors = malloc(8); 

вы выделяете только 8 байт переменной colors. Недостаточно хранить шесть строк. Если вам нужны восемь строк, почему бы просто не создать массив из восьми строк?

char *colors[8] = { NULL }; 

Вышеуказанное заявление объявляет colors как массив из восьми указателей на char, все указатели инициализируются NULL.

Если вам отчаянно нужно выделить кучу, то вы, например, делаете это.

char **colors = calloc(8, sizeof(char *)); 

calloc Я использую, чтобы убедиться, что выделенная память равна нулю инициализирован (т.е. все указатели будут NULL).


Кроме того, sscanf не автоматически выделять пространство для строк он сканирует, вы должны сделать это вручную. Самый простой, вероятно, использовать модификатор 'm' в коде формата, как

sscanf(input, "%ms %ms %ms %ms %ms %ms", 
     &color[0], &color[1], &color[2], &color[3], &color[4], &color[5]); 
+0

Спасибо. Единственная причина, по которой я использую двойной указатель, - это то, что я могу вернуть его в функцию. Насколько я понимаю, я не могу вернуть массив, правильно? Это моя дилемма. Я попытался выделить больше памяти для ** цветов, но все равно делает то же самое. Причина, по которой я выделил такую ​​небольшую сумму, состояла в том, что я думал, что мне нужно только несколько адресов, по одному для каждого элемента * color []. – mosdellg

+0

@mosdellg Затем проверьте мою строку в ответе вызовом 'calloc'. И правильно, что вы не можете вернуть указатель на локальный массив из функции. И помните, что размер, предоставленный 'malloc', - это число * bytes *, а указатель обычно равен четырем (на 32-битных платформах) или восьми (на 64-битных платформах) байтам. –

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