Как объявить массив указателей на массив char * - PullRequest
0 голосов
/ 11 мая 2019

Проблема при доступе к каждому адресу массива указателей, объединяет мои данные с последующими

Code in the image is merging my data

Ответы [ 2 ]

1 голос
/ 11 мая 2019
#include <stdio.h>
#include <string.h>

/* String are NULL terminated, you might have read comments in question */
unsigned char mydata1[] = {0x41, 0x42, 0x43, 0x00};
unsigned char mydata2[] = {0x44, 0x45, 0x46, 0x00};
unsigned char mydata3[] = {0x47, 0x48, 0x49, 0x4A, 0x00};

/* Here I have used a NULL terminated array so that we can traverse 
 * even if we do not know the length of array 
 */
unsigned char *charPtr[] = 
{
        mydata1,
        mydata2,
        mydata3,
        NULL
};

int main()
{
        int i;

        for (i = 0; charPtr[i] != NULL; i++) {
                printf("%s\n", charPtr[i]);
        }

        return 0;
}
1 голос
/ 11 мая 2019

Как отмечается в замечании, ваши массивы не заканчиваются нулевым символом, поэтому printf продолжается после них.

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

Таким образом, минимальные изменения

unsigned char mydata1[] = {0x41,0x42,0x43, 0};
unsigned char mydata2[] = {0x44,0x45,0x46, 0};
unsigned char mydata3[] = {0x47,0x48,0x49,0x4A, 0}

но этот способ предполагает, что ваш компилятор использует код ASCII, и это не читается, лучше сделать

unsigned char mydata1[] = {'A', 'B', 'C', 0};
unsigned char mydata2[] = {'D', 'E', 'F', 0};
unsigned char mydata3[] = {'G','H','I','J', 0};

или более простой:

unsigned char mydata1[] = "ABC";
unsigned char mydata2[] = "DEF";
unsigned char mydata3[] = "GHIJ";

Из этого

  • делать for(i = 0; i < 3; i++) - это опасно , потому что если вы измените количество элементов на charPtr , вам также потребуется изменить для , один из способов - добавить указатель NULL, чтобы отметить конец списка указателей и выполнить итерацию до указателя NULL, а другой - выполнить итерацию, пока i < (sizeof(charPtr)/sizeof(charPtr[0])).
  • лучше не использовать int для ввода i , но size_t, потому что это естественный тип для индекса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...