以空值结尾的 C 字符数组



1. 以下哪项末尾添加了空终止符?

int main()
{
char arr[]="sample";
char arr2[6]="sample";
char arr3[7]="sample";
char* strarr="sample";  
char* strarr1=arr;  
char* strarr2=arr2; 
char* strarr3=arr3; 
return 0;
}

2. 如果出现以下情况printf("%s",somestr)会失败吗?

  • somestr个字符数组末尾没有空终止字符?
  • somestr指向末尾
  • 没有空终止字符的字符的连续位置的char*

编辑:有没有办法检查 gdb 中是否有char*char数组是否为空终止?

首先,"sample"称为字符串文字。它声明一个以空字符结尾的常量字符数组。

让我们继续:

char arr[]="sample";

大小为 7 的 const 字符数组中的右侧部分(6 个字符和一个''.arr 的维数是从其初始化推导出来的,也是 7。然后从文本字符串初始化 char 数组。

char arr2[6]="sample";

arr2声明的大小为 6。它从大小为 7 的字符串文本初始化:只有 6 个声明的位置被初始化为{'s', 'a', 'm', 'p', 'l', 'e'},没有终止 null。这里没有任何问题,除了将arr2传递给需要以 null 结尾的字符串的函数会调用未定义的行为。

char arr3[7]="sample";

声明的大小和初始化文本字符串大小都是 7:它只是第一个用例的显式版本。相当危险,因为如果您稍后在初始化字符串中添加一个字符,您将获得一个不以 null 结尾的 char 数组。

char* strarr="sample";  

避免这种情况。您正在字符串文本上声明一个非常量字符指针。虽然标准明确声明:

如果程序尝试修改这样的数组,则行为为 定义。

然后,strarr[3] = 'i'将在没有警告的情况下调用未定义的行为。话虽如此,只要您从不修改字符串,您就有一个很好的 null 终止字符串。

char* strarr1=arr;

好的,你声明一个指向另一个字符串的指针。或者更准确地说是指向另一个字符串的第一个字符的指针。并且它正确终止为空。

char* strarr2=arr2; 

您有一个指向非以 null 结尾的字符数组的第一个字符的指针...您不能将arr2传递给需要以空结尾的字符数组的函数,也不能传递strarr2

char* strarr3=arr3;

您有另一个指向字符串的指针。与strarr1相同的行为。


根据如何在 gdb中签入终止 null,您不能直接打印它,因为 gdb 知道足够的 C 字符串来自动停止打印第一个空字符上的字符串。但是,您始终可以使用p arr[7]来查看数组后面的字符是否为 null。

对于arr2arr2+7是数组的过去。因此,不确定那里有什么,在一个真正糟糕的系统中,使用p arr[7]可能会发出信号,因为它可能是在内存段结束后 - 但我必须承认我从未见过......

>arrarr3中的每一个都包含一个在调用函数时在堆栈上分配的以 null 结尾的字符串。

strarr指向在程序的只读数据部分中分配的以 null 结尾的字符串。

strarr1指向调用函数时在堆栈上分配的以 null 结尾的字符串。

strarr3指向调用函数时在堆栈上分配的以 null 结尾的字符串。

str指向与strarr1相同的字符串。

最新更新