与此问题类似: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();
答案 0 :(得分:11)
我觉得图片有帮助。这是char newarray[5][10]
。它是一个单独的内存块,由10个字符的数组组成,其中包含5个字符的数组。
你可以通过一次memset
电话清除它。
这是char **array
。它说array
是一个指针。
什么是指针?
指向角色的指针。
请记住指针算术。
如果array
是一个恰好指向指针的指针,
然后(*array)
等于array[0]
,这是array
指向的指针。
什么是array[1]
?
它是array
指向的数组中的第二个指针。
什么是array[0][0]
?
它是array
指向的第一个指针指向的第一个字符。
什么是array[i][j]
?
它是array
指向的 i 指针的 j 字符。
那么newarray
和array
如何相关?
简单。
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'。