我一直在用c ++编写一个问题但是我陷入了困境.这是一个很长的代码,但我只会在我现在被卡住的地方发布一小部分内容.这里是;
char* x = (char*)malloc(sizeof(char));
char y = (char)malloc(sizeof(char));
y = *x;
Run Code Online (Sandbox Code Playgroud)
问题是当我这样做时,如果X指向名为"HELLO"的字符,当我打印y时它只打印'H'字母.
我想将char*所有的单词复制到char变量中.此外,我不知道char的大小,因为它们是由用户给出的.所以长度可以是任何东西.我试过strcpy()但无法解决问题.
任何帮助赞赏.
**感谢所有的评论.现在我决定根据你的评论使用std :: string.而且我想我永远不会再使用malloc了.现在我必须回到代码并根据字符串更改所有内容并检查是否一切正常.
它不应该 - 它应该崩溃,事实上它可能甚至不应该编译!
这条线char y = (char)malloc(sizeof(char));没有意义
malloc保留一些内存,然后返回一个指向该内存的指针 - 你不能指定一个非指针变量的指针,如'y'
同样在第1行中,您已要求malloc为单个char保留内存,sizeof(char)= 1,而不是用户输入的字符数.
用Inigo Montoya来解释,我不认为这段代码意味着你的意思.
malloc(sizeof(char))
这会分配一定量的内存.分配的内存量由malloc参数决定.在这种情况下sizeof(char),根据定义,您传递的是一个字节.因此,您正在分配一个字节的内存.
如果您坚持使用malloc(稍后会详细介绍),那么您应该做的是确定要存储的字符串的长度,为NULL终止符再添加一个字节,然后再malloc这么多.对于Hello, world.13个字符的字符串,相应的调用将是:
malloc(14)
下一个:
char y = (char)malloc(sizeof(char));
malloc返回指向它为您分配的内存的指针. y在这种情况下不是指针,它只是一个char.两者不一样.它编译并且似乎有效,因为你使用了一种称为C风格的强制转换工具: (char)malloc(...).这告诉编译器,"我知道我把枪对准了我的脚.做我告诉你的事情,不要抱怨." 它尽职尽责.但是你做错了事有几个原因:
malloc 返回一个指针,但你正试图将它转换为 chary只是一个,char但你把它看作是一个完整的字符串.所以,如果你再次坚持使用malloc,你需要做这样的事情:
static const char* HELLO = "Hello, malloc.";
char* x = malloc(strlen(HELLO)+1);
strcpy(x, HELLO);
char* y = malloc(strlen(x)+1);
strcpy(y, x);
Run Code Online (Sandbox Code Playgroud)
但是,你不应该malloc在C++中使用它.相反,你应该使用std::string:
std::string x = "Hello, string.";
std::string y = x;
Run Code Online (Sandbox Code Playgroud)
这更好,因为:
string管理自己的记忆.您不会像在代码中那样泄漏内存.string类型更安全.将回报转换malloc为a 时违反了类型安全性char.你可以做到,但不是char.那很糟. string不会让你这么努力地射击自己.| 归档时间: |
|
| 查看次数: |
3620 次 |
| 最近记录: |