0

我有一段代码,其中包含以下几行:

char* someString = "Blah"
char* someOtherString = someString;

if (someString) {
    while (*someOtherString) {
        printf("%d\n",someOtherString);
        ++someOtherString;
    }
    --someOtherString;
}

这打印出来:

4206692
4206693
4206694
4206695

它是如何工作的?我知道它通过 if 语句为真,因为 someString 可以解释为真条件,但它如何退出 while 循环?

当我像这样自己键入 while 循环时,我循环无限地进行:

 while (*someOtherString) {
     printf("%d\n",someOtherString);
     ++someOtherString;
}

感谢您在高级的帮助!

4

3 回答 3

3

当找到NUL“字符串”末尾的字符时,while 循环退出。


在职的 :

在 C 中,在双引号内声明和分配常量字符串声明了一个以空字符结尾的字符串。分配的内存等于 双引号+ 1(用于尾随NUL字符)中的字符数。每个字符按顺序存储在内存块中,并且一个NUL字符自动分配到内存块的末尾。

因此,“ Blah ”在内存中存储为
B L A H \0

最初someOtherStringsomeString都指向B

someOtherString递增以指向 while 循环的每次迭代中的下一个字符。因此,经过 4 次迭代后,它最终指向空字符。

在未初始化数据上运行的 while 循环可能会运行大量迭代,因为不能保证它会遇到 NUL字符(字节 = 0x00)。


最后是在 C 中处理字符串的常用函数扩展列表。

于 2013-08-07T03:49:04.063 回答
2

这只是一种扫描字符串的技术。

当你只是告诉字符串char *string1 = "hello"起始地址时,将存储在变量char *string1而不是字符串中。一种做法是在不使用时分配一个指针NULL,而不是允许其中的旧地址值,这现在是无效的。因此,如果在某个时候我们做了string1 = NULL,那么if (string1)将是错误的,因为NULL计算结果为 0。

            a1     a2    a3    a4    a5   a6
          +-----+-----+-----+-----+-----+-----+
string1 = |  h  |  e  |  l  |  l  |  o  | \0  |
          +-----+-----+-----+-----+-----+-----+

而当我们这样做*string1时,基本上是形式*(string + x)。根据指针的类型string1x元素将首先被跳过,然后*将在该位置进行解引用,x元素远离存储的地址string1

            a1     a2    a3    a4    a5   a6
          +-----+-----+-----+-----+-----+-----+
string1 = |  h  |  e  |  l  |  l  |  o  | \0  |
          +-----+-----+-----+-----+-----+-----+
                               ^
                               |
                 +-------------+
                 |
 *(string1 + 3) same as string1[3]

因此,doing*string1将获取存储在中的地址所指向的值string1

所以

if (string1)
{
   while (*string1)
   {
      count++;
      string1++;
   }
}

这将输入if如果存储在字符串中的地址不是 NULL,即分配了一些有效地址(如果我们按照约定将 NULL 分配给未使用)。在特定迭代中存储的地址指向非零值*string之前,它将为真。string1C 字符串以 NUL 字符结尾,该字符是'\0'并且具有 ASCII 值0。在我们执行的每次迭代中string1++,这将增加存储的地址值,并且在每次增加之后,值string1将指向下一个相邻的元素(首先a1然后a2等)。当它指向'\0'存储的地址时,*string1将为 0 并且while (*string1)为 false 从而跳出循环。

于 2013-08-07T04:36:32.687 回答
0

您的字符串文字存储在内存中,例如:

{'B', 'l', 'a', 'h', '\0'}

...其中 '\0' 是空字符(即解释为整数时值为 0 的字符)。

所以最终(在 4 个增量之后),*someOtherString将评估为 0,这将被解释为false并结束循环。

我不确定你是如何获得无限循环的。您的精简版本在 ideone 中运行良好:http: //ideone.com/4fTDJb

于 2013-08-07T03:52:04.360 回答