Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中使用char2d数组分割错误_C_Arrays_2d - Fatal编程技术网

在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;
}