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
是一个char数组,末尾没有空终止符吗?somestr
是char*
指向字符的连续位置,末尾没有空终止符吗? 编辑:有没有一种方法可以在gdb中检查char*
或char
数组是否为空终止?
答案 0 :(得分:-1)
调用函数时,arr
和arr3
中的每一个都包含在堆栈中分配的以空终止的字符串。
strarr
指向在程序的只读数据部分分配的空终止字符串。
strarr1
指向在调用函数时在堆栈上分配的空终止字符串。
strarr3
指向在调用函数时在堆栈上分配的空终止字符串。
str
指向与strarr1
相同的字符串。
答案 1 :(得分:-1)
首先,"sample"
被称为字符串文字。它声明一个以空字符结尾的const char数组。
让我们继续:
char arr[]="sample";
一个大小为7(6个字符和一个'\0'
的const char数组的右手部分。arr的维数是从其初始化推导出的,也是7)。然后从文字字符串中初始化char数组
char arr2[6]="sample";
arr2
的声明大小为6。它是从大小为7的字符串文字中初始化的:只有6个声明的位置被初始化为{'s', 'a', 'm', 'p', 'l', 'e'}
,没有终止空值 。这里没有什么错,除了将arr2
传递给期望以空终止的字符串的函数会调用未定义行为。
char arr3[7]="sample";
声明的大小和初始化文字字符串的大小均为7:这只是第一个用例的显式版本。相当危险,因为如果以后在初始化字符串中添加一个字符,则会得到一个不为null终止的char数组。
char* strarr="sample";
避免。您在字符串文字上声明了一个非const char指针。虽然该标准明确声明:
如果程序尝试修改这样的数组,则行为是 未定义。
strarr[3] = 'i'
然后将在没有警告的情况下调用未定义行为。话虽这么说,并且只要您从不修改字符串,那么您将拥有一个漂亮的以null终止的字符串。
char* strarr1=arr;
好的,您声明一个指向另一个字符串的指针。或更确切地说,是指向另一个字符串的第一个字符的指针。并且它正确为null终止。
char* strarr2=arr2;
您有一个指向不以null终止的char数组的第一个字符的指针...您无法将arr2
传递给期望以null终止的char数组的函数,并且不能传递strarr2
char* strarr3=arr3;
您还有另一个指向字符串的指针。行为与strarr1
相同。
根据如何在gdb中签入终止空值,您无法直接打印它,因为gdb知道足够的C字符串来自动停止在第一个空字符上打印字符串。但是您始终可以使用p arr[7]
来查看数组后面的字符是否为空。
对于arr2
,arr2+7
在数组之后。因此,使用p arr[7]
可能会在内存段结束之后使用信号class myModel extends ChangeNotifier {...}
class myModel with ChangeNotifier {...}
,这在真正错误的系统中存在什么是不确定的,但我必须承认我从未见过... < / p>