【问题标题】:getting char element like array in c在c中获取类似数组的char元素
【发布时间】:2017-10-14 16:11:26
【问题描述】:

我已经实现了一个具有初始大小的动态数组,并在其中插入了一个包含两列的数组,例如{{"aa","bb"},{"cc","dd"},{"ff","gg"}} 这是我的代码。该元素看起来可以直接存储在数组中,但我不知道如何获取类似的元素ptr_arr[i][j].

typedef struct {
    char **array;
    size_t used;
    size_t size;
} Array;

void initArray(Array *a, size_t initialSize) {
    a->array = (char **)malloc(initialSize * sizeof(char *));
    int i;
    for (i = 0; i < 2; i++) {
        a->array[i] = (char *) malloc(initialSize * sizeof(char *));
    }
    a->used = 0;
    a->size = initialSize;
}

void insertArray(Array *a, char* (*element)[2]) {
    if (a->used == a->size) {
        a->size *= 2;
        a->array = (char **)realloc(a->array, a->size * sizeof(char));
    }
    a->array[a->used++] = *(*element);

}

int main(int argc, const char * argv[]) {
    Array ptr_arr;
    initArray(&ptr_arr, 1);
    char *b[] = {"85","9u"};
    insertArray(&ptr_arr, &b);
    printf("%s \n", (ptr_arr.array[0][1])); //this is just i want to use
    return 0;
}

【问题讨论】:

  • a-&gt;array = (char **)malloc(initialSize * sizeof(char *)); --> a-&gt;array = malloc(sizeof *(a-&gt;array) * 2);
  • @chux 有什么问题?我没明白。
  • 您的代码 malloc(initialSize * sizeof(char *)) 分配了 1 个指针。 malloc(sizeof *(a-&gt;array) * 2); 分配 2 个指针用于下面的 for (i = 0; i &lt; 2; i++) {
  • @chux 没有任何改变,我仍然不能以这种方式使用它。
  • “不能以那种方式使用它”缺乏细节。请展开。

标签: c arrays string multidimensional-array char


【解决方案1】:

喜欢这个

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

typedef struct {
    char* (*array)[2];
    size_t used;
    size_t size;
} Array;

void initArray(Array *a, size_t initialSize) {
    a->array = malloc(initialSize * sizeof(char *[2]));
    a->used = 0;
    a->size = initialSize;
}

void insertArray(Array *a, char* (*element)[2]) {
    if (a->used == a->size) {
        a->size *= 2;
        a->array = realloc(a->array, a->size * sizeof(char *[2]));
    }
    a->array[a->used][0] = element[0][0];
    a->array[a->used++][1] = element[0][1];
}

int main(int argc, const char * argv[]) {
    Array ptr_arr;
    initArray(&ptr_arr, 1);
    char *b[] = {"85","9u"};
    insertArray(&ptr_arr, &b);
    printf("%s \n", (ptr_arr.array[0][1]));//9u
    free(ptr_arr.array);
    return 0;
}

【讨论】:

    【解决方案2】:

    二维数组是一个指向其他数组的指针数组。要动态地执行此操作,您必须为每行分配一个单维数组和 1 个单维数组来保存这些数组(行)的指针。 比如:

    char **Array;
    char *Array_line;
    
    Array = malloc(initialSizeY * sizeof(char *));
    
    for(int i=0; i<initialSizeY; i++)
    {
        Array_line = malloc(initialSizeX * sizeof(char));
        Array[i] = Array_line;
    }
    

    然后您可以使用 Array[i][j] 访问您的数据,其中 i 指向数组的第 i 行,而 j 是该行的第 j 个字符。

    要释放这个数组,你应该首先抓取它,释放它的每一行(Array[i]),然后释放指针持有者数组(Array)。

    【讨论】:

    • 详细信息:int a[3][4] 是二维数组的示例。对于char **Array;Array 不是二维数组,而是指向char * 的指针。
    • @mike fayya - 你到底需要什么? - 二维字符数组、一维字符串数组还是二维字符串数组?在你的 main() printf("%s \n", (ptr_arr.array[0][1])); 会尝试访问一个 2D 字符串数组,它是一个 3D 字符数组!
    • @TodorSimeonov 我只想要像 {{"aa","bb"}} 这样的二维字符数组。
    • @mike-fayya {{"aa","bb"}} 不是二维字符数组。这是一个字符串的二维数组(或字符的三维数组,因为字符串只是一个字符数组)。
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多