空终止的C字符数组

时间:2019-06-20 04:51:32

标签: c arrays pointers c-strings

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数组,末尾没有空终止符吗?
  • somestrchar*指向字符的连续位置,末尾没有空终止符吗?

编辑:有没有一种方法可以在gdb中检查char*char数组是否为空终止?

2 个答案:

答案 0 :(得分:-1)

调用函数时,arrarr3中的每一个都包含在堆栈中分配的以空终止的字符串。

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]来查看数组后面的字符是否为空。

对于arr2arr2+7在数组之后。因此,使用p arr[7]可能会在内存段结束之后使用信号class myModel extends ChangeNotifier {...} class myModel with ChangeNotifier {...} ,这在真正错误的系统中存在什么是不确定的,但我必须承认我从未见过... < / p>