Будет ли char * xx [401] создавать 401 указатель на символ или указатель на символ [401]? - PullRequest
0 голосов
/ 16 апреля 2020

Мне нужно создать двойной указатель символа, который будет иметь 401 массив символов.

Будет ли char *xx[401] работать, или мне придется использовать mallo c и друзей? Если да, то как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

С

char *xx[401];

вы объявляете массив из 401 указателей на char. Все они должны быть инициализированы в некоторый другой существующий массив символов, например, таким образом

char foo[20] = "Hello";
xx[107] = foo;

или malloc 'ed, если они предназначены для динамически размещаемого массива строк.

Если все эти malloc s вас беспокоят, вы всегда можете определить его статически

char xx[401][20+1] = { 0 };

/* Population of element at index 137 with a string defined somewhere else in the code: */
char str[] = "Hi guys";

strncpy(xx[123], str, 20);

(в этом примере каждая строка будет иметь фиксированную длину 20 + 1). Но это должна быть глобальная переменная: размещение ее в стеке не будет лучшим решением.

0 голосов
/ 16 апреля 2020

Чтобы было понятно, вы можете переписать это объявление

char *xx[401]; 

как

char * ( xx[401] ); 

То есть это массив с 401 элементом типа char *.

Указатель на этот массив будет выглядеть как

char * ( *pxx )[401] = &xx; 

Указатель на элемент массива будет выглядеть как

char ** pxx = xx; 

Если вы хотите динамически распределить массив с 401 элементом тип char *, тогда код может выглядеть следующим образом:

char ** pxx = malloc( 401 * sizeof( char * ) ); 

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

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

int main(void) 
{
    enum { N = 2, M = 6 };

    const char * hello[N] = { "Hello", "World" };

    char **s = malloc( N * sizeof( char * ) );

    for ( size_t i = 0; i < N; i++ )
    {
        s[i] = malloc( M );
        strcpy( s[i], hello[i] );
    }

    for ( size_t i = 0; i < N; i++ )
    {
        if ( i != 0 ) putchar( ' ' );
        printf( "%s", s[i] );
    }

    putchar( '\n' );

    for ( size_t i = 0; i < N; i++ )
    {
        free( s[i] );
    }

    free( s );

    return 0;
}

Программа вывод

Hello World
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...