0

我尝试分配内存,存储一个字符串然后打印它,但我认为它不起作用。

#include<stdio.h>
#include<windows.h>
int main()
{
    char* allochere;
    allochere = malloc(sizeof(char));
    *allochere = "Hello";
    printf("%s",allochere);


    return 0;
}
4

6 回答 6

3

赋值*allochere只为未初始化字符串的第一个字符赋值。分配的值对引导是无意义的,因为分配的右侧是一个指针。(如果你打开编译警告,编译器会警告你这种赋值的问题。)

要正确初始化字符串,您需要调用strcpy复制字符串:

strcpy(allochere, "Hello");

此外,您需要分配allochere正确的大小来保存您打算放在那里的字符串:

allochere = malloc(strlen("Hello") + 1);
于 2013-10-04T22:39:33.673 回答
2

这里有几个错误。

首先,您应该知道 C 字符串以零字节结尾。多亏了这一点,您不必存储字符串的长度,您只需使用零字节说“这是我的字符串的结尾”。

其次,你打电话malloc()的方式不对。如果你想为一个 N 字母字符串分配内存,你应该写malloc(N + 1);(+1,因为零字节也必须有它的单元格)。

最后,你应该使用一个函数,比如strcpy将字符串复制到它的目的地。在这种情况下,您应该调用strcpy(allochere, "Hello").

您的代码应如下所示:

char* allochere;
allochere = malloc(6*sizeof(char));
strcpy(allochere, "Hello");
printf("%s", allochere);

...

// don't forget to deallocate the memory
free(allochere);
于 2013-10-04T22:42:34.733 回答
2

该代码没有任何意义。

char *allochere;

'allochere' 是指向 char 的指针,换句话说,是一个字符串。

allochere = malloc(sizeof(char));

现在您分配一个字符,并将“allochere”指向它。顺便说一句,sizeof(char)始终为 1。

*allochere = "Hello";

现在你将“allochere”的第一个字符设置为“const char *”,编译器会在这里出错。现在 allochere 指向随机数据,而不是字符串。

让我们看看一些可行的替代方案。

char *allochere;
allochere = "Hello";
printf("%s", allochere);

char *allochere;
allochere = strdup("Hello");
printf("%s", allochere);

char *allochere;
allochere = malloc(strlen("Hello") + 1);
strcpy(allochere, "Hello");
printf("%s", allochere);
于 2013-10-04T22:46:44.390 回答
1

你需要这样的东西。

#include<stdio.h>
#include<windows.h>

int main()
{
    char* allochere;

    allochere = malloc(strlen("Hello") + 1);

    strcpy(allochere, "Hello");
    printf("%s\n", allochere);

    return 0;
}
于 2013-10-04T22:42:31.013 回答
1

您没有分配足够的内存来保存单词“Hello” - 您需要为 5 个字符加上终止字节分配空间,因此您应该将 malloc 调用替换为:

allochere = malloc(6);

您不能将字符串文字分配给 allochere,因为您将错过指向已分配内存的指针。相反,在分配足够的空间后,使用 strcpy:

strcpy(allochere, "Hello");
于 2013-10-04T22:39:48.613 回答
0

在这种情况下,您实际上需要将数据直接从字符串常量复制"Hello"到您分配的空间中。然而,在我们到达那里之前,有几个问题。

  1. 确保您分配了足够的空间。

    您正在分配sizeof一个字符,不足以容纳整个字符串(“Hello”中的 5 个字符加上一个空终止符)。你可以这样做

    allochere = malloc(6);
    

    或使用常见的约定

    allochere = malloc(strlen("Hello") + 1);
    

    为了更清楚地了解您为其分配内存的大小和目的。

  2. 您需要复制数据,因为字符串分配并不完全了解您要做什么。通过做

    *allochere = "Hello";
    

    您实际上将 at 的值分配allochere"Hello". 相反,如果您这样做了:

    allochere = "Hello";
    

    这实际上可能有效(在某些系统上——我不确定也没有测试过),但那是因为你正在分配地址并寻址到一个地址。

    但是,您正在malloc输入数据,这意味着您要复制数据。因此,您将需要使用类似strcpy从该位置复制到您分配的字符串的东西。因此:

    strcpy(allochere, "Hello");
    
  3. 最后一个问题将是实际看到输出。因为您使用的是printf,所以您需要将数据刷新到屏幕上。 printf如果您有换行符 ( '\n') 字符,将自动刷新数据,但您也可以使用fflush().

于 2013-10-04T22:49:06.877 回答