[英]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"
直接复制到分配的空间中。 但是,在我们到达那里之前,有两个问题。
确保分配了足够的空间。
您正在分配一个字符的sizeof
,不足以容纳整个字符串(“ Hello”中的5个字符,再加上一个空终止符,另外一个字符)。 你可以这样做
allochere = malloc(6);
或使用以下通用约定
allochere = malloc(strlen("Hello") + 1);
为了更清楚地了解其大小和用途,您正在为其分配内存。
您需要复制数据,因为字符串分配无法完全理解您要执行的操作。 通过做
*allochere = "Hello";
您实际上是将allochere
的值分配为"Hello"
的地址。 相反,如果您这样做:
allochere = "Hello";
这可能实际上可行(在某些系统上-我不确定并且尚未测试),但这是因为您要分配地址和地址。
但是,你malloc
ING的数据,这意味着你要复制的数据。 因此,您将需要使用诸如strcpy
东西从该位置复制到您分配的字符串中。 因此:
strcpy(allochere, "Hello");
最后一个问题将是实际上看到输出。 由于您使用的是printf
,因此需要将数据刷新到屏幕上。 如果您有换行符( '\\n'
), printf
将自动刷新数据,但您也可以使用fflush()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.