我一直在用c ++编写一个问题,但我陷入了困境。 这是一个很长的代码,但我只会在我现在被卡住的地方发布一小部分内容。这是;
char* x = (char*)malloc(sizeof(char));
char y = (char)malloc(sizeof(char));
y = *x;
问题是当我这样做时,如果X指向名为“HELLO”的字符,当我打印y时它只打印'H'字母。
我想将char *所有的单词复制到char变量中。此外,我不知道char的大小,因为它们是由用户给出的。所以长度可以是任何东西。我尝试过strcpy()但无法解决问题。
任何帮助表示感谢。
**感谢所有评论。现在我决定根据你的评论使用std :: string。而且我想我永远不会再使用malloc了。现在我必须回到代码并根据字符串更改所有内容并检查一切是否正常。
答案 0 :(得分:5)
IT不应该 - 它应该崩溃,事实上它甚至可能不应该编译!
第char y = (char)malloc(sizeof(char));
行没有意义
malloc保留一些内存,然后返回一个指向该内存的指针 - 你不能指定指向非指针变量的指针,例如'y'
同样在第1行,您已要求malloc为单个char保留内存,sizeof(char)= 1,而不是用户输入的字符数。
答案 1 :(得分:5)
用Inigo Montoya来解释,我不认为这段代码意味着你的意思。
malloc(sizeof(char))
这会分配一定量的内存。分配了多少内存由malloc
的参数决定。在这种情况下,您正在传递sizeof(char)
,根据定义,它正好是一个字节。因此,您正在分配一个字节的内存。
如果您坚持使用malloc
(稍后会详细介绍),那么您应该做的是确定要存储的字符串的长度,为NULL终止符添加一个字节,然后{ {1}}那么多。如果字符串malloc
为13个字符,则相应的调用将为:
Hello, world.
下一步:
malloc(14)
char y = (char)malloc(sizeof(char));
返回指向它为你分配的内存的指针。在这种情况下,malloc
不是指针,它只是y
。两者不一样。它会编译并出现,因为你使用了一种称为C风格的强制转换工具:char
。这告诉编译器,“我知道我把枪对准了我的脚。做我告诉你的事情,不要抱怨。”它尽职尽责。但是你做错了事有几个原因:
(char)malloc(...)
会返回一个指针,但您尝试将其转换为malloc
char
只是y
,但您将其视为整个字符串。因此,如果您再次坚持使用char
,则需要执行以下操作:
malloc
但是,你不应该在C ++中使用static const char* HELLO = "Hello, malloc.";
char* x = malloc(strlen(HELLO)+1);
strcpy(x, HELLO);
char* y = malloc(strlen(x)+1);
strcpy(y, x);
。相反,您应该使用malloc
:
std::string
这更好,因为:
std::string x = "Hello, string.";
std::string y = x;
管理自己的记忆。您不会像在代码中那样泄漏内存。string
类型更安全。将回报从string
转换为malloc
时,您违反了类型安全。你可以这样做,但它不是char
。那很糟。 char
不会让你不费吹灰之力就这样拍摄自己。答案 2 :(得分:1)
您不能将整个单词放入char
变量,因为char
类型只包含一个字符。由于标准C中没有string
类型,因此您需要使用一个字符数组来表示字符串。
此外,malloc
函数只返回指针,因为您尝试分配的内存驻留在堆上的某个位置。没有办法(*)动态增长或缩小堆栈以包含可变长度值。
(*)标准C中没有办法,尽管它有一些空间可以使用非标准的非标准功能。
答案 3 :(得分:1)
首选std::string
。
因为C样式字符串使用指针,所以不能使用赋值(operator=
)复制它们。
您必须使用strxxx
系列函数(例如strcpy
)进行复制。 请记住在复制前为接收器分配内存。
答案 4 :(得分:0)
关于此代码的一切都是错误的。第一行为一个字符分配空间,并将地址存储在x中。事实上,如果它没有崩溃就能拥有多个角色,那就是纯粹的运气。第二行更糟糕,因为它为一个字符分配空间,然后将地址转换为单个字符。
看起来应该更像这样: char x =(char )malloc(sizeof(char)* sizeOfYourString); char y =(char )malloc(sizeof(char)* sizeOfYourOtherString);
strcpy(x,y);