一个新手问题:
我正在练习赋予char指针,但发现没有打印出来。这是代码:
#include <stdio.h>
int main (void)
{
char * option_string = NULL;
option_string = (char*)malloc(sizeof(5));
memset(option_string, 0, sizeof(char) * 5);
int j;
for ( j = 0; j < 5; j++)
{
*option_string++ = 'a';
}
printf("print options_string: %s\n", option_string); //!nothing was printed out!
free(option_string);
return 0;
}
提前致谢!
答案 0 :(得分:11)
增加指针option_string
,使其指向字符串末尾。
尝试 的malloc(6);
for ( j = 0; j < 5; j++)
{
option_string[j] = 'a';
}
代替。
答案 1 :(得分:8)
您的malloc(sizeof(5))
似乎有误。 5
的大小是多少? (提示:这不是5。)
答案 2 :(得分:4)
你的问题是在循环内你写*option_string++
。这意味着一旦完成循环,你将指向字符串末尾:
option_string at start
|
V
+----+----+----+----+----+
| | | | | |
| | | | | |
+----+----+----+----+----+
^
|
option_string at end
请注意,这揭示了您的代码的第二个问题:C中的字符串以空值终止,但此字符串最终将包含“aaaaa”,然后......谁知道?垃圾,很可能,但你不能说。你需要一个六长串。修复第一个问题意味着使用简单的索引:option_string[j] = 'a'
。如果您真的需要*option_string++
方法,则必须保存并恢复option_string
(char * real_option_string = option_string; ... option_string = real_option_string;
),但我不推荐它。修复这两个错误,以及一些风格的东西,为您提供:
#include <stdlib.h>
#include <stdio.h>
int main (void)
{
char * option_string = calloc(6, sizeof(char));
int j;
for ( j = 0; j < 5; j++)
{
option_string[j] = 'a';
}
printf("print options_string: %s\n", option_string);
free(option_string);
return 0;
}
我改变的另一件事是malloc
用法。我觉得calloc
在这里是一个更好的风格选择; calloc(count, size)
分配大小为count
的{{1}}个对象,并将它们归零。它就像size
加上一个memset,但对我来说感觉更干净。你也不应该对malloc(count*size)
/ malloc
/等进行强制转换,一般来说(它可能会掩盖有用的警告),你需要分配六个插槽,比如我说(所以你可以使用null-terminator,这是零值字符,所以我们不需要显式设置它)。将其与calloc
索引模式相结合,为option_string[j]
添加缺少的stdlib.h
(您应该已将其用于calloc
),我们很高兴去!