2010-07-12 6 views
5

Я пытался заставить это работать в течение нескольких часов, но, похоже, я не могу его обвести.Возвращаемый массив строк

Я пытаюсь написать функцию, которая может возвращать массив строк.

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

/** 
* This is just a test, error checking ommited 
*/ 

int FillArray(char *** Data); 

int main() 
{ 
    char ** Data; //will hold the array 

    //build array 
    FillArray(&Data); 

    //output to test if it worked 
    printf("%s\n", Data[0]); 
    printf("%s\n", Data[1]); 

    return EXIT_SUCCESS; 
} 


int FillArray(char *** Data) 
{ 
    //allocate enough for 2 indices 
    *Data = malloc(sizeof(char*) * 2); 

    //strings that will be stored 
    char * Hello = "hello\0"; 
    char * Goodbye = "goodbye\0"; 

    //fill the array 
    Data[0] = &Hello; 
    Data[1] = &Goodbye; 

    return EXIT_SUCCESS; 
} 

Я, вероятно, получать вперемешку с указателями где-то, потому что я получаю следующий результат:

привет
Сегментация Fault

+2

Вам не нужно '\ 0' в конце строки. Когда вы используете двойные кавычки, компилятор добавляет вам символ '\ 0'. Вам нужно только '\ 0', если вы объявляете свои строки, как' char Hello [] = {'h', 'e', ​​'l', 'l', 'o', '\ 0'}; ' –

+1

I знаю, что мне неприятно, но, пожалуйста, освободи, что у тебя есть malloc'd. Это хорошая практика, и если вы всегда это делаете, когда пишете код, вы будете забывать реже. – Daniel

+0

Я знал, что мне не нужен нулевой ограничитель, но включил его по какой-то причине, спасибо, что указали это. Спасибо, Дэн, я обычно это делаю, но это был просто тест. Благодарю. – Kewley

ответ

10

Да, вы получили указатель indirections перепутали, членов из массива данных должен быть установлен следующим образом:

(*Data)[0] = Hello; 
(*Data)[1] = Goodbye; 

в функции, Dataуказывает на массив, это не массив.

Другое примечание: вам не нужно указывать в строковых литералах явные символы \0, они автоматически заканчиваются на нуль.

+0

Я пробовал это изначально и не мог понять, почему это не сработало, но я сделал это без скобок. Большое спасибо!! :) – Kewley

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