二维字符数组

问题描述 投票:3回答:6
#include<stdio.h>

void main()
{
    char a[10][5] = {"hi", "hello", "fellow"};
    printf("%s",a[0]);
}

为什么这个代码打印只喜

#include<stdio.h>

void main()
{
    char a[10][5] = {"hi", "hello", "fellow"};
    printf("%s",a[1]);
}

虽然这段代码正在打印“hellofellow”

c output
6个回答
2
投票

为什么这个代码打印只喜

你已经告诉printf打印存储在a[0]的字符串,那个字符串恰好是"hi"

虽然这段代码正在打印“hellofellow”

这个巧合,实际上你的代码应该被编译器拒绝,因为a constraint violation

初始化程序不应尝试为未初始化的实体中包含的对象提供值。

字符串"fellow",特别是它末尾的'w'不适合初始化的char[5],这违反了C标准。也许巧合的是,你的编译器提供了一个扩展(在技术上使它成为非C编译器),所以你没有看到我做的the error messages

prog.c:3:6: error: return type of 'main' is not 'int' [-Werror=main]
 void main()
      ^
prog.c: In function 'main':
prog.c:5:37: error: initializer-string for array of chars is too long [-Werror]
     char a[10][5] = {"hi", "hello", "fellow"};
                                     ^

请注意,第二条错误消息是抱怨"fellow",但不是"hello"。你的"hello"初始化is valid by exception

字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选地用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。

重点是我的。强调的部分指出,如果没有足够的空间容纳终端'\0'字符,那将不会用于初始化。


2
投票

你的代码:

 char a[10][5] = {"hi", "hello", "fellow"};

分配10个char [5]

“你好”占用5,所以没有空间终止\0,所以它遇到“伙伴”

如果你试试,a [3]应该是“w”因为“伙伴”太大而“w”从a[2]a[3]

除了未定义的行为之外,您正在尝试做的事情令人困惑


2
投票

它将给出不确定的行为,因为qazxsw poi是qazxsw poi。

元素string的长度为null-terminated。将您的数组声明为hello然后您将得到预期的输出。

看这里-5

为什么这个代码打印只喜

因为a[10][7]https://ideone.com/c2zUs0,表示终止因此给你a[0][2]


1
投票

这是未定义的行为,因为没有足够的空间来存储null字符。

请注意,在字符串数组中,为每个字符串分配的内存为hibytes。因此,对于\0,没有足够的内存来存储5字符,因为所有五个字节都分配有a[1]

因此,读取后续存储器直到找到\0字符。

因此,您可以更改该行:

"hello"

\0

为什么这个代码打印只喜

这是因为在char a[10][5] = {"hi", "hello", "fellow"}; 已经遇到char a[][7] = {"hi", "hello", "fellow"}; 字符,因此停止了字符的读取。


1
投票

您的代码的作用:

请看以下声明:

\0

它分配a[0][2]行。 char a[10][5] = {"hi", "hello", "fellow"}; 字符分配给10的每个索引。

问题是什么:

字符串是5除了给定的字符之外总是需要存储a,所以基本上使用的数组大小是Null Terminated,额外的一个字节用于空终止符。当您使用null-terminator字符数初始化数组时,将跳过numOfCharacters+1。通常打印字符数组值,直到找不到第一个size(空终止符)。还请看看null terminator

解决方案:

无需担心此问题,您只需将大小设置为等于\0即可。您可以使用以下语句:

this

由于最大的字符串是包含numOfCharactersInString + 1字符的char a[10][7] = {"hi", "hello", "fellow"}; ,你需要设置大小"fellow",这就是为什么语句应该使用6而不是char 6 + 1

希望能帮助到你。


1
投票

声明二维字符数组时

char a[10][7]

char a [10] [5]保留存储器以存储10个长度为5的字符串,这意味着4个字符+ 1个\ 0'字符。需要注意的是,数组元素存储在连续的内存位置。

a [0]指向第一个字符串,a [1]指向第二个字符串,依此类推。

此外,当您初始化一个数组时,其他未初始化的元素将变为0而不是垃圾值。

现在在你的情况下,在初始化之后,如果你试图可视化数组,那就像是

喜\ 0 \ 0 \ 0hellofello \ 0 \ 0 ...

现在命令

a[10][5]

打印从“hi”的'h'开始的字符,并在遇到'\ 0'时停止打印,因此打印“hi”。

现在针对第二种情况,

char a[10][5] = {"hi", "hello", "fellow"};

字符从“hello”的'h'开始打印,直到遇到'\ 0'。现在只有在打印“hellofello”后才会遇到'\ 0'字符,因此输出。

© www.soinside.com 2019 - 2024. All rights reserved.