打印手动制作的字符串不起作用

时间:2017-08-27 01:07:50

标签: c string memory

int main() {
  char a = 'b';
  char* c = &a;
  *c = 'a';
  *(c+1) = 'j';
  *(c+2) = '\0';

  printf("%s\n", (char*)&a);
}

它会打印角色' a'和' j'但它打印垃圾,似乎忽略了空终止字符。

为什么?

2 个答案:

答案 0 :(得分:3)

你做了什么导致未定义的行为,因为char指针c没有指向能够存储你的字符串的内存块。

因此,当您将指针前进1或/和2时,您将访问与指针ca指向的位置无关的内存,并且您将导致分段错误,或者访问程序已分配的内存,但这是随机和坏的。

你需要为a(多少?2个字符,加上空终止符)分配空间,这会给你一个大小为3的字符数组。然后将指针c设置为开头a。现在,您可以使用c进行指针运算,从0到2(数组大小为1),并通过指针分配所需的字符和空终止符。

#include <stdio.h>

int main() {
  char a[3];
  char* c = a; // set 'c' point to the start of the array 'a'
  *c = 'a';
  *(c+1) = 'j';
  *(c+2) = '\0';

  printf("%s\n", a);
}
  

AJ

答案 1 :(得分:-2)

因为你需要分配一个缓冲区,所以你不能只是拿一个指针写入那个地址。

我猜这是为了学习目的,因为你可以这样做:

char *a = "bj\0";
printf("%s\n", a);

如果你想追加字符,我强烈建议你使用std :: string。 否则,你必须做这样的事情:

char a[3]; // You need to allocate a defined size!
char* c = a;
*c = 'a';
*(c+1) = 'j';
*(c+2) = '\0';

printf("%s\n", (char*)&a);

或没有演员:

printf("%s\n", c);

抱歉,我没有编译,所以可能存在拼写错误。