C:这个char指针赋值有什么问题?

时间:2010-11-29 23:47:19

标签: c string pointers variable-assignment character

一个新手问题:

我正在练习赋予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; 
}

提前致谢!

3 个答案:

答案 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_stringchar * 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),我们很高兴去!