初始化char类型的数组

时间:2011-06-01 11:52:06

标签: c arrays pointers char

我想初始化任意大字符串。它是以null结尾的字符串,但我无法打印其内容。 谁能告诉我为什么?

char* b;
char c;
b = &c;
*b = 'm';
*(b+1) = 'o';
*(b+2) = 'j';
*(b+3) = 'a';
*(b+4) = '\0';
printf("%s\n", *b);

8 个答案:

答案 0 :(得分:10)

您的解决方案调用未定义的行为,因为*(b+1)等超出了堆栈变量c的范围。因此,当你写信给他们的时候,你写的是你不拥有的内存,这会导致各种各样的腐败。此外,您需要printf("%s\n", b)printf期望指向%s)。

解决方案取决于您想要做什么。您可以初始化指向字符串文字的指针:

const char *str1 = "moja";

您可以初始化字符数组:

char str2[] = "moja";

这也可以写成:

char str2[] = { 'm', 'o', 'j', 'a', '\0' };

或者您可以手动分配字符串的值:

char *str3 = malloc(5);
str3[0] = 'm';
str3[1] = 'o';
str3[2] = 'j';
str3[3] = 'a';
str3[4] = '\0';

...

free(str3);

答案 1 :(得分:2)

这可能会导致分段错误! *(b + 1),*(b + 2)等指未分配的区域。首先分配内存,然后写入内存!

答案 2 :(得分:1)

您需要为malloc或使用静态数组分配内存空间。在这里,在您的代码中,您只使用一个字符的地址存储在该字符的地址中,后面的其他字符。这没有定义。

请注意,一步一步,你正在做什么。首先,将指针指定为指向内存中的单个char空间。然后,使用*b = 'm'将该内存设置为字符“m”。但是,您可以访问下一个内存位置(未定义,因为没有为该位置保留内存)来存储另一个值。这不起作用。

怎么做?

您有两种选择。例如:

char *b;
char c[5];
b = &c[0];
*b = 'm';
... //rest of your code

这样可行,因为c中有5个字符的空格。另一种选择是使用b直接为malloc分配内存:

char * b = (char*) malloc(5);
*b = 'm';
... // rest of your code

最后,也许不是你想要的,但你可以使用字符串文字来初始化char数组或指针:

char c[] = "hello";
const char* b = "abcdef";

答案 3 :(得分:1)

b没有足够的空间来容纳所有这些字符。使用malloc分配足够的空间或将b声明为char数组。

答案 4 :(得分:1)

如果您编写以下内容而不是printf,则会打印第一个字符。

printf("%c\n", *b);

为了让您拥有任意大的字符串,您需要使用bstring之类的库,或者自己编写一个。

这是因为,在C中需要获取内存,使用它并相应地释放它。在您的情况下,b仅指向一个字符,除非您使用malloc为其分配内存。对于malloc,您必须指定固定大小。

对于任意大的字符串,您需要将实际指针封装到您自己的数据结构中的字符,然后根据要设置为其值的字符串的长度来管理其大小。

答案 5 :(得分:1)

您的代码根本不安全!您只使用char c;在堆栈上分配1个字符,但将5个字符写入其中!这会给你一个堆栈溢出,这可能非常危险。

另一件事:打印时不得取消引用字符串:printf("%s\n", b);

为什么不简单地写const char *b = "mojo";

答案 6 :(得分:1)

printf("%s\n", *b);

为什么*?

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

是你想要的

答案 7 :(得分:1)

printf不打印,因为它需要char *,所以你应该传递b,而不是* b。 要初始化指向字符串常量的指针,您可以执行以下操作:

char *s1 = "A string"

char s2[] = "Another string"

或者用char *b = malloc(5)分配一个缓冲区,然后写入这个缓冲区(就像你一样,或者使用字符串函数)

你所做的是获取单个char内存位置的地址然后写入过去,可能会覆盖其他变量或指令,从而可能导致数据损坏或崩溃。