2013-06-27 3 views
2

В основном методе я создаю массив указателей на строку в методе добавления. Я перераспределяю размер массива и добавляю x элементов, которые я не знаю while вернувшись к главному, как я могу узнать новый размер массива, я имею в виду количество элементов int array?Как найти новый размер массива указателя на строку

Вот мой код .. (он имеет некоторые ошибки)

#include <stdio.h> 

void add(char ***x); 

int main() 
{ 
    char **s; 
    s = (char **) malloc(sizeof(char *)); 
    int i; 
    add(&s); 

    for(i=1;i<=?????(**find the new size of the array**);i++) 
    puts(*s[i]); 

    return 0; 
} 

void add(char ***x) 
{ 

    - ** // alter arry add x random datas to the array of string pointer** 

    /* 
    s[1]="Hello"; 
    s[2]="Need"; 
    s[3]="a help"; 
    s[4]="and help"; 
    s[5]="for the help"; 
    */ 

    char **data; 
    int i = 0; 
    for (i = 1; i <= 5; i++) 
    { 
    data = (char **) realloc(*x, 1 * sizeof(char *)); 
    data[i] = (char *) malloc(i * sizeof(char *)); 
    strcpy(data[i], "first"); 
    } 

} 

может кто-то один, пожалуйста, указывают и исправить ошибку в коде ..

+0

hah, upvoted, потому что реальная проблема программирования/вопрос ... плюс это заставило меня задуматься о http://c2.com/cgi/wiki?ThreeStarProgrammer снова. О, золотые старые C-времена ... (ссылка просто хорошая, она не предназначена для того, чтобы сказать, что вы не должны делать *** в своем случае - для струн - отлично) – Najzero

+1

[Не бросайте возвращаемое значение 'malloc()' (или 'realloc()') в C] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – unwind

+0

так как исправить ..? – Kajal

ответ

3

(Sidenote:

может кто-нибудь указать и исправить ошибку в коде.

эй, не так ли? в отладчиков для)

Короче говоря, следить за его вручную:

char **func_that_reallocs(char **ptr, size_t *sz) 
{ 
    char **tmp = realloc(ptr, new_size * sizeof(*ptr)); 
    *sz = new_size; 
    return tmp; 
} 

И пожалуйстаdo not cast the return value of malloc()!

2

Всегда добавляйте одну запись больше массива по мере необходимости и установить этот дополнительный последняя запись до NULL.

Затем напишите функцию, которая сканирует массив до тех пор, пока не найдет этот NULL -pointer и вернет количество записей, подсчитанных до тех пор, и вы закончите.

Это та же концепция, что и для C- "string", с единственной разницей в использовании NULL вместо '\0' как (array-) terminator.

Некоторые люди называют этот последний элемент также «пробкой» -элементом.

Положительный момент в этом подходе состоит в том, что не нужно сохранять размер массива в другой переменной, которая может выйти из синхронизации с реальным размером массива: размер неявно задается самим массивом.

+0

Обратите внимание, что это имеет смысл только тогда, когда массив часто повторяется. Else нет смысла перебирать список в 'O (n)' каждый раз, когда мы хотим узнать его длину. (Да, 'strlen()' ** ** сломан и Pascal скалы.) –

+0

@ H2CO3: Действительно, для больших массивов, сканируемых часто, существует проблема с производительностью при таком подходе. OT и yes: никогда не используется строка, длина которой превышает 255 символов, или это изменение произошло в то же время? ;-) – alk