在C中初始化2D char数组

时间:2014-11-15 01:23:27

标签: c arrays initialization

与此问题类似:2d array, using calloc in C

我需要帮助初始化一个2D char数组,它将全部初始化为某个值(在本例中为'0')。我尝试了很多不同的方法,我正在拔头发。请让我知道我做错了什么。此代码不起作用。谢谢!

char** init_array() {
        char newarray[5][10];
        int i, j;
        for (i = 0; i < 5; i++) {
                for (j = 0; j < 10; j++) {
                        newarray[i][j] = '0';
                }
        }
        return newarray;
}
char **array = init_array();

我尝试编译时从gcc获得的错误:

test.c: In function ‘init_array’:
test.c:12:2: warning: return from incompatible pointer type [enabled by default]
  return newarray;
  ^
test.c:12:2: warning: function returns address of local variable [-Wreturn-local-addr]
test.c: At top level:
test.c:14:1: error: initializer element is not constant
 char **array = init_array();

它应该是这样吗?

char newarray[5][10];
char** init_array() {
        int i, j;
        for (i = 0; i < 5; i++) {
                for (j = 0; j < 10; j++) {
                        newarray[i][j] = '0';
                }
        }
        return newarray;
}
char **array = init_array();

3 个答案:

答案 0 :(得分:11)

我觉得图片有帮助。这是char newarray[5][10]。它是一个单独的内存块,由10个字符的数组组成,其中包含5个字符的数组。 你可以通过一次memset电话清除它。

enter image description here

这是char **array。它说array是一个指针。 什么是指针? 指向角色的指针。

enter image description here

请记住指针算术。 如果array是一个恰好指向指针的指针, 然后(*array)等于array[0],这是array指向的指针。

什么是array[1]? 它是array指向的数组中的第二个指针

什么是array[0][0]? 它是array指向的第一个指针指向的第一个字符。

什么是array[i][j]? 它是array指向的 i 指针的 j 字符。

那么newarrayarray如何相关? 简单。 newarray[i][j] i newarray子阵列的 j 字符。

所以从这个意义上来说,它就像array一样,但没有下面的所有指针。

区别是什么? 嗯,array的缺点是你必须逐个建立起来。 OTOH,优点是你可以在构建时尽可能大。 它不必生活在事先已知的固定大小内。

清除泥土?

答案 1 :(得分:2)

根据我们在评论中的讨论,这里是一个在声明时将数组值归零的快速示例。注意,值为#defined作为常量:

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

#define MAXSTR 10
#define MAXLEN 1024

int main () {

    char myarray[MAXSTR][MAXLEN] = {{0}};  /* declare a static array of MAXSTR x MAXLEN */

    /* copy various strings to statically declared storage */
    strncpy (myarray[0],"  This is the first string", strlen("  This is the first string")+1);
    strncpy (myarray[1],"  This is the second string", strlen("  This is the second string")+1);
    strncpy (myarray[2],"  This is the third string", strlen("  This is the third string")+1);
    strncpy (myarray[3],"  This is the fourth string", strlen("  This is the fourth string")+1);
    strncpy (myarray[4],"  This is the fifth string", strlen("  This is the fifth string")+1);

    int i = 0;

    /* print the values */
    while (*myarray[i])
        printf ("  %s\n", myarray[i++]);

    return 0;
}

<强>输出:

$ ./myar
    This is the first string
    This is the second string
    This is the third string
    This is the fourth string
    This is the fifth string

<强>构建

gcc -Wall -Wextra -o myar myarray.c

答案 2 :(得分:1)

为避免使用全局(如上面粘贴的第二个示例代码)并避免使用malloc,您可以在函数外部定义数组并将其传入,如下所示。您不需要返回任何内容,因为数组数据本身正在被修改。请注意,有必要在函数签名中定义数组的辅助维度:

void init_array(char ary[][10]) {
    int i, j;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 10; j++) {
                ary[i][j] = '0';
        }
    }
}

int main(void)
{
    char newarray[5][10];
    init_array(newarray);
    printf("%c", newarray[1][1]); /* Testing the output */
    return 0;
}

返回'0'。

http://codepad.org/JbykYcyF