在c语言中使用char2d数组分割错误
我需要创建一个二维字符阵列,如下所示:在c语言中使用char2d数组分割错误,c,arrays,2d,C,Arrays,2d,我需要创建一个二维字符阵列,如下所示: ---- |..| |..| ---- 为此,我编写了一个函数numed Build_Screen,如下所示 #include<stdio.h> #include"build.h" void Build_Screen(char **c, int w, int k) { int i=0, j=0; for(; i<w;i++) { j=0; for(; j<k;j++
----
|..|
|..|
----
为此,我编写了一个函数numed Build_Screen,如下所示
#include<stdio.h>
#include"build.h"
void Build_Screen(char **c, int w, int k)
{
int i=0, j=0;
for(; i<w;i++)
{
j=0;
for(; j<k;j++)
{
if (i==0||i==w-1)
c[i][j]='-';
else
{
if(j==0||j==k-1)
c[i][j]='|';
else
c[i][j]='.';
}
}
}
}
char screen[5][5];
Build_Screen(screen, 5, 5);
这引起了混乱。我该如何解决这个问题?问题是您的函数
char **
与char[5][5]
不同,因此只需更改
void Build_Screen(char **c, int w, int k)
与
您必须将数组,而不是指针
传递到字符指针
,您可以看到,这已经解释过了
如果你手边不知道尺码,那么就用这种方法
void Build\u屏幕(字符**c,整数w,整数k)
{
int i,j;
对于@iharob所写的(i=0;i),函数的签名没有按预期工作。您应该使用单指针char*c并像这样或类似的方式对数组进行索引:
c[i+w*j]
也可以作为一维数组访问数组。
以下代码已在本地成功测试:
void Build_Screen(char* c, int w, int k)
{
int i = 0, j = 0;
for (; i<w; i++)
{
j = 0;
for (; j<k; j++)
{
if (i == 0 || i == w - 1)
c[i*w+j] = '-';
else
{
if (j == 0 || j == k - 1)
c[i*w + j] = '|';
else
c[i*w + j] = '.';
}
}
}
}
int main()
{
char screen[5][5];
Build_Screen((char*)screen, 5, 5);
}
void Build_屏幕(字符*c、整数w、整数k)
{
int i=0,j=0;
对于(;i实际上,当您声明:
char screen[5][5];
发生了什么?它在堆栈上分配5*5*sizeof(char)
连续字节,由screen[0]
指向。
因此,屏幕[0][1]
严格等同于*(屏幕[0]+0*5+1);
通过将函数的签名更改为,可以轻松解决您的问题
void Build_Screen(char c[5][5], int w, int k);
我想您希望有一个可以处理任意大小地图的函数。除了C99之外,C中的真正2D数组不会出现这种情况。更多详细信息可用。字符[5][5]是2D数组,而不是字符**。它是一个由25个字符组成的连续区域:
00 01 02 03 04 10 11 12 13 14 20 ...
char**
是指向char的指针:
0 -> 00 01 02 03 04
1 -> 10 11 12 13 14
2 -> 20 ...
3 -> 30 ...
4 -> 40 ...
您必须这样声明:
char ascreen[5][5];
char *screen[5];
for(i=0; i<5; i++) screen[i] = &(ascreen[i][0]);
Build_Screen(screen, 5, 5);
使用gdb查找错误看起来你的数组屏幕在给构建函数时没有初始化。你怎么知道他是这样打印的?我想缺少的只是数组的正确初始化。错误在函数中,而不是在打印中。我尝试过这样做,但仍然是一个分段错误,我用ch char打印了它ar所以我不需要anny\0 Sing如果我不知道它的大小会是什么呢?那么你需要malloc
。你不能这样初始化它。我只想说这是另一种未定义的行为。你之所以能逃脱,是因为你铸造了char*
。因为屏幕2d数组是在堆栈上分配的,所以将具有连续的堆栈内存,因此可以解释为一维数组。如果动态分配,则可能会有所不同。如果我错了,请纠正我。或者,未定义的行为是什么意思?C不定义转换为不兼容的类型。type(*)[*]
和type*
不兼容。char*
是一个例外。事实上,这是我不知道也不注意的。至少从中了解到了一些关于C的知识。谢谢。它确实对我有用。它说:工作:assingment从整数中生成指针而不使用强制转换[默认启用]
0 -> 00 01 02 03 04
1 -> 10 11 12 13 14
2 -> 20 ...
3 -> 30 ...
4 -> 40 ...
char ascreen[5][5];
char *screen[5];
for(i=0; i<5; i++) screen[i] = &(ascreen[i][0]);
Build_Screen(screen, 5, 5);
#include<stdio.h>
void Build_Screen(char **c, int w, int k)
{
int i=0, j=0;
for(; i<w;i++)
{
j=0;
for(; j<k;j++)
{
if (i==0||i==w-1)
c[i][j]='-';
else
{
if(j==0||j==k-1)
c[i][j]='|';
else
c[i][j]='.';
}
}
}
}
int main() {
int i;
char ascreen[5][5];
char *screen[5];
for(i=0; i<5; i++) screen[i] = &(ascreen[i][0]);
Build_Screen(screen, 5, 5);
for(i=0; i<5; i++) {
printf("%.5s\n", screen[i]); /* or printf("%.5s\n", ascreen[i]); */
}
return 0;
}