为字符串分配内存

时间:2013-10-04 22:35:30

标签: c

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

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


    return 0;
}

6 个答案:

答案 0 :(得分:3)

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

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

strcpy(allochere, "Hello");

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

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

答案 1 :(得分: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);

答案 2 :(得分:2)

该代码没有任何意义。

char *allochere;

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

allochere = malloc(sizeof(char));

现在你分配一个字符,然后指向'allochere'。顺便说一句,sizeof(char)总是1。

*allochere = "Hello";

现在你将'allochere'的第一个char设置为'const char *',编译器会在这里barf。现在,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);

答案 3 :(得分:1)

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

allochere = malloc(6);

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

strcpy(allochere, "Hello");

答案 4 :(得分: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;
}

答案 5 :(得分:0)

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

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

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

    执行此操作
    allochere = malloc(6);
    

    或使用

    的通用惯例
    allochere = malloc(strlen("Hello") + 1);
    

    更清楚地说明为内存分配的大小和目的。

  2. 您需要复制数据,因为字符串分配并不能准确理解您要执行的操作。通过做

    *allochere = "Hello";
    

    您实际上是将allochere的值指定为"Hello"的地址。如果你做了这个:

    allochere = "Hello";
    

    这实际上可能有效(在某些系统上 - 我不确定并且没有测试过),但那是因为你要分配地址并将其写入地址。

    但是,您malloc数据意味着要复制数据。因此,您需要使用strcpy之类的东西从该位置复制到您分配的字符串中。因此:

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