以空结尾的C字符数组

以空结尾的C字符数组,c,arrays,pointers,c-strings,C,Arrays,Pointers,C Strings,一,。以下哪项在末尾添加了空终止符 二,。如果出现以下情况,printf%s、somestr是否会失败: somestr是一个字符数组,末尾没有空终止字符? somestr是一个字符*指向字符的连续位置,末尾没有空终止字符? 编辑:有没有办法在gdb中检查char*或char数组是否以null结尾?调用函数时,arr和arr3中的每一个都包含在堆栈上分配的以null结尾的字符串 strarr指向在程序的只读数据部分中分配的以null结尾的字符串 strarr1指向调用函数时在堆栈上分配的以nul

一,。以下哪项在末尾添加了空终止符

二,。如果出现以下情况,printf%s、somestr是否会失败:

somestr是一个字符数组,末尾没有空终止字符? somestr是一个字符*指向字符的连续位置,末尾没有空终止字符? 编辑:有没有办法在gdb中检查char*或char数组是否以null结尾?

调用函数时,arr和arr3中的每一个都包含在堆栈上分配的以null结尾的字符串

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

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

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

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

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

让我们继续:

    char arr[]="sample";
大小为7-6个字符的常量字符数组中的右侧部分和“\0”。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:它只是第一个用例的显式版本。这相当危险,因为如果稍后向初始化字符串添加一个字符,将得到一个以非空结尾的字符数组

    char* strarr="sample";  
避免这样。您正在字符串文本上声明一个非常量字符指针。标准明确声明:

如果程序试图修改这样的数组,则该行为是 未定义

strarr[3]=“i”随后将在没有警告的情况下调用未定义的行为。也就是说,如果您从不修改字符串,那么您就有了一个很好的以null结尾的字符串

    char* strarr1=arr;
好的,您声明一个指向另一个字符串的指针。或者更确切地说是指向另一个字符串的第一个字符的指针。并且它正确地以null结尾

    char* strarr2=arr2; 
您有一个指向以非null结尾的字符数组的第一个字符的指针。。。无法将arr2传递给需要以null结尾的字符数组的函数,也无法传递strarr2

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

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


对于arr2,arr2+7是超过阵列的值。因此,在一个真正糟糕的系统中,使用p arr[7]可能会发出一个信号,因为它可能在内存段结束后-但我必须承认,我从未见过…

看起来你复制了分配给StackOverflow的作业。当然,我们可以为你做这件事,但是如果你想学习编程,你应该自己花时间来解决这个问题。不,这不是家庭作业。如果你也把我引向一个类似的问题,只要它回答了我的问题就可以了。我也可以,如果你只回答编辑,这样我就可以自己找出所有答案。首先,终止字符取决于编译器。另外,以char foo[5]=abcd为例;这是一个有效的初始化,但char foo[4]=abcd;事实并非如此。另外,看看@kalpajagrawalla No,这些都不依赖于编译器。和'char-too[4]=abcd;在C语言中是有效的,并且具有定义良好的语义。@anurag86如果是家庭作业,那么问从书中抄袭的内容或面试问题,这并不重要。但是你需要问一些具体的问题,你应该发布你自己的研究成果和调试尝试,这样你就可以清楚地知道你不了解哪一部分。就目前而言,您的问题太广泛了,基本上字符串在C中是如何工作的,答案是:阅读初级编程书中关于字符串的章节。thnx。您还可以回答关于printf以及检查gdb中以null结尾的字符的方法吗?@anurag86:printf的行为尚未确定。在这种情况下,null字符很可能出现在内存中的某个点上,因此这取决于该点是否为可读内存区。因此,arr、strarr、strarr1的printf不会被定义。但是,arr2、arr3和strarr2、strarr3的printf未定义。是吗?@anurag86:不,因为未定义和未定义通常是同一回事。没有arr4。我看到您对编辑的抱怨,但请修复它。C实现可能会出现错误
ut arr、arr2和arr3在堆栈上,但是如果函数中的其他代码允许,它可能会将它们存储在其他位置,因为C关于可观察行为的规则,因此断言它们在堆栈上是错误的。C标准不要求strarr指向的内存为只读。arr3不是常量对象。你对char*s=foo的考虑也是值得避免的。字符串文字虽然通常是只读的,但不是常量。@Billy:从语言律师的角度来看,你是绝对正确的:字符串文字是字符数组,从不声明为常量。简单地说,任何修改此类数组的尝试都是未定义的行为,因此必须像处理常量一样处理它们。这就是为什么char arr=foo;非常危险:您可以轻松调用未定义的行为,而无需编译器警告。无论如何,我已经编辑了我的答案,希望我的意图更清楚。我投了更高的票,因为我同意你所说的。但不幸的是,Ludin投票决定关闭,认为这是一个家庭作业。顺便问一下,为什么说声明大小和初始化文本字符串大小对于char arr3[7]=sample;,都是7。我之所以包含这个示例,只是因为即使样本大小为6,arr3[6]中也应该有空终止字符的空间,因此应该是安全的。我假设在前面的arr[6]以及sample\0中添加了null终止字符,但它超出了索引。但对于你写的arr3来说,这更危险。空终止符不是在arr3的限制范围内自动添加并被认为是安全的吗?我如何在gdb中看到空终止符?我试过了,但它不能简单地用p命令显示
    char* strarr2=arr2; 
    char* strarr3=arr3;