2013-06-18 2 views
-3

Мне не нужно указывать длину массива в программе. Вместо этого I должны принимать входные данные массива (строки) из консоли и динамически I должны выделять память для данного входного массива. Можете ли вы мне помочь. (На языке C)Как инициализировать массив динамически без указания размера массива в C

+0

https://groups.google.com/forum/?fromgroups#!msg/comp.lang.perl/wu0T7a9orc0/3Q4PVIbEzZUJ –

+0

возможно дубликат [динамического распределения памяти и динамического массива] (HTTP: // stackoverflow.com/questions/8481188/dynamic-memory-allocation-and-dynamic-array) –

ответ

0

Используйте malloc, чтобы выделить память в куче для вашего массива.

+0

Привет, Спасибо за ответ. – Vamsi

+0

Я написал такой код и получил ошибку сегментации. #include #include INT Основной() { символ * аг; int size; printf ("Размер Enetr массива:"); scanf ("% d", размер); ar = (char *) malloc (размер); printf ("\ nВведите строку:"); зсап ("% s", &ar); Е ("\ п \ п \ nString является:% s", аги); возврата 0; } – Vamsi

+0

Вы должны пройти зсап указателя, где он может хранить значение : scanf ("% d", &size); – urzeit

-1

Указатель в C может использоваться как массив. Фактически some_pointer[0] может использоваться вместо *some_pointer. Поэтому, если вы убедитесь, что some_pointer указывает на область памяти с необходимым размером, вы можете использовать этот указатель так же, как массив. Вы можете использовать malloc, чтобы получить эту память из диспетчера памяти:

some_type *some_pointer; 
some_pointer = (some_type *)malloc(sizeof(some_type) * size_of_your_array); 
/* Some code that uses some_pointer[i] with 0 <= i < size_of_your_array */ 
free(some_pointer); 
/* Some code NOT using the pointer */ 

Обратите внимание на free в конце кода. Это освободит память. Если вы не использовали этот free, память будет потребляться во время работы вашей программы (по крайней мере).

Обратите внимание, что информация о размере массива не сохраняется (в отличие от массива, где sizeof может использоваться, поскольку размер массива является частью определения типа).

+2

Нет, массив * не * совпадает с указателем. массив иногда «распадается» на указатель, но они не совпадают. – unwind

+0

@unwind: Не могли бы вы указать разницу между ac-массивом и верным c-указателем? Я думаю, что они на самом деле одинаковы, поскольку существует нет информации о размере, хранящейся в c. – urzeit

+0

@Dayal rai является правильным. – urzeit

0

E.g.

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

char *getString(FILE* fp){ 
    char *str; 
    int ch; 
    size_t len = 0, size = 16; 
    str = realloc(NULL, sizeof(char)*size);//size is start size 
    if(!str)return str; 
    while(EOF!=(ch=fgetc(fp)) && ch != '\n'){ 
     str[len++]=ch; 
     if(len==size){ 
      str = realloc(str, sizeof(char)*(size+=16));//expand size 
      if(!str)return str; 
     } 
    } 
    str[len++]='\0'; 

    return realloc(str, sizeof(char)*len); 
} 

int main(void){ 
    char *str; 

    printf("input string : "); 
    str = getString(stdin); 
    printf("%s\n", str); 

    free(str); 
    return 0; 
} 
Смежные вопросы