繁体   English   中英

为字符串分配内存

[英]Allocating Memory for a string

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

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


    return 0;
}

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

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

strcpy(allochere, "Hello");

另外,您需要以正确的大小分配allochere ,以保存要放置在此处的字符串:

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

这里有几个错误。

首先,您应该知道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);

该代码没有任何意义。

char *allochere;

“ allochere”是指向char的指针,换句话说,是字符串。

allochere = malloc(sizeof(char));

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

*allochere = "Hello";

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

让我们看看一些可行的选择。

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);

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

allochere = malloc(6);

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

strcpy(allochere, "Hello");

您需要这样的东西。

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

int main()
{
    char* allochere;

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

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

    return 0;
}

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

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

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

     allochere = malloc(6); 

    或使用以下通用约定

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

    为了更清楚地了解其大小和用途,您正在为其分配内存。

  2. 您需要复制数据,因为字符串分配无法完全理解您要执行的操作。 通过做

     *allochere = "Hello"; 

    您实际上是将allochere的值分配为"Hello"的地址。 相反,如果您这样做:

     allochere = "Hello"; 

    这可能实际上可行(在某些系统上-我不确定并且尚未测试),但这是因为您要分配地址和地址。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM