C String Length使用null

时间:2017-10-22 04:53:08

标签: c string

我知道C语言有动态长度字符串,因此它使用特殊字符null(表示为0)来终止字符串 - 而不是保持长度。
我有这个简单的C代码,它在第五个索引中创建一个带有空字符的字符串:

#include <stdio.h>
#include <stdlib.h>
int main () {   
  char * s= "sdfsd\0sfdfsd";
  printf("%s",s);
  s[5]='3';
  printf("%s",s);
  return 0;
}

因此,字符串的打印将仅输出到第五个索引。然后代码将第五个索引处的字符更改为&#39; 3&#39;。鉴于我的理解,我认为它将使用3而不是null来打印完整的字符串,如下所示: sdfsdsdfsd3sfdfsd

但它输出: sdfsdsdfsd

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:2)

此程序显示未定义的行为,因为您修改了只读字符串文字。 char* s = "..."使s指向常量内存; C ++实际上不允许将非const char*指向字符串文字,但在C中它仍然可能,我们必须小心(有关更多详细信息,请参阅this SO answer和C99标准引用)< / p>

将作业行更改为:

char s[] = "sdfsd\0sfdfsd";

在堆栈上创建一个数组并将字符串复制到它,作为初始化程序。在这种情况下,修改s[5]是有效的,您将获得预期的结果。

答案 1 :(得分:1)

此操作失败:

s[5] = 3;

您正在尝试更改字符串文字,它始终是只读的。我的测试显示该程序退出了segfault:

Segmentation fault (core dumped)

在尝试更改它之前,您应该将它存储在数组(或已分配的内存)中:

char s[] = "sdfsd\0sfdfsd";

通过上述更改,程序按预期工作。

答案 2 :(得分:1)

无法更改字符串文字,因为编译器将字符串文字放入只读数据部分(但这可能因底层平台而异)。尝试修改字符串文字的效果未定义。

在您的代码中:

char * s= "sdfsd\0sfdfsd"

这里,s是指向存储在只读内存中的字符串"sdfsd\0sfdfsd"的char指针,使其成为不可变的。

在这里,您尝试修改只读内存的内容:

s[5]='3';

导致未定义的行为。

相反,您可以使用char []:

#include <stdio.h>

int main () {
  char a[] = "sdfsd\0sfdfsd";
  char * s = a;
  printf("%s",s);
  s[5]='3';
  printf("%s\n",s);
  return 0;
}

答案 3 :(得分:-1)

#include <stdio.h>

int main(){
    char x[10] = "aa\0a";
    x[2] = '1';
    puts(x);

    printf("\n\n\nPress any key to exit...");
    getch();
    return 0;
}

输出:aa1a