我尝试分配内存,存储一个字符串然后打印它,但我认为它不起作用。
#include<stdio.h>
#include<windows.h>
int main()
{
char* allochere;
allochere = malloc(sizeof(char));
*allochere = "Hello";
printf("%s",allochere);
return 0;
}
我尝试分配内存,存储一个字符串然后打印它,但我认为它不起作用。
#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 *”,编译器会在这里出错。现在 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);
你需要这样的东西。
#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” - 您需要为 5 个字符加上终止字节分配空间,因此您应该将 malloc 调用替换为:
allochere = malloc(6);
您不能将字符串文字分配给 allochere,因为您将错过指向已分配内存的指针。相反,在分配足够的空间后,使用 strcpy:
strcpy(allochere, "Hello");
在这种情况下,您实际上需要将数据直接从字符串常量复制"Hello"
到您分配的空间中。然而,在我们到达那里之前,有几个问题。
确保您分配了足够的空间。
您正在分配sizeof
一个字符,不足以容纳整个字符串(“Hello”中的 5 个字符加上一个空终止符)。你可以这样做
allochere = malloc(6);
或使用常见的约定
allochere = malloc(strlen("Hello") + 1);
为了更清楚地了解您为其分配内存的大小和目的。
您需要复制数据,因为字符串分配并不完全了解您要做什么。通过做
*allochere = "Hello";
您实际上将 at 的值分配allochere
为"Hello"
. 相反,如果您这样做了:
allochere = "Hello";
这实际上可能有效(在某些系统上——我不确定也没有测试过),但那是因为你正在分配地址并寻址到一个地址。
但是,您正在malloc
输入数据,这意味着您要复制数据。因此,您将需要使用类似strcpy
从该位置复制到您分配的字符串的东西。因此:
strcpy(allochere, "Hello");
最后一个问题将是实际看到输出。因为您使用的是printf
,所以您需要将数据刷新到屏幕上。 printf
如果您有换行符 ( '\n'
) 字符,将自动刷新数据,但您也可以使用fflush()
.