从本质上讲,我试图创建一个程序,简单地接受来自用户的输入,然后打印,使用动态分配的内存。是的,我知道该怎么做这简单的方法,但我试图获得与内存管理的C.错综复杂交手那么,什么是错的代码?它运行没有错误,但是当我在一个字符串进入命令行就停止工作,抛出以十六进制地址异常。先感谢您。
int main() {
char *input;
input = (char *)malloc(20 * sizeof(char));
puts("Enter the string you wish to display");
scanf_s("%s", input);
printf_s("%s", *input);
free(input);
return 0;
}
你的编译器应该是警告你这行:
printf_s("%s", *input);
如果没有,您需要启用的“所有警告”设置。 (开gcc和铛,-Wextra
添加到命令行)。
从本质上讲,你的论点(char
)的类型和格式字符串(const char*
)期望的类型不匹配。 *input
取消引用字符指针,所以计算结果为字符串中的第一个字符。 "%s"
需要一个指向字符的空终止阵列。
如果您删除*
它应该工作:
printf_s("%s", input);
你可能希望这样的:
#include <stdio.h>
#include <stdlib.h>
int main() {
char *input;
input = malloc(20 * sizeof(char)); // (char *) is not needed here (but doesn't harm either)
puts("Enter the string you wish to display");
scanf("%s", input);
printf("%s", input); // *input is wrong here
free(input);
return 0;
}
不要使用_s
verions,因为它们不是每个平台或多或少毫无意义上的标准,只要使用scanf
和printf
。
您正在使用scanf_s("%s", ...
错误。
逐字从the docs:
更安全的功能(即具有_s后缀)和其他版本之间的主要区别是,更安全的功能所需要的大小在每个C,C,S,S,和[类型字段的字符作为一个参数传递立即可变以下。
所以,如果input
点20 char
序列的第一个字符,则应该是:
scanf_s("%s", input, 20);
经验教训:如果有疑问,(再)阅读文件!