抛出异常使用malloc()时创建字符数组

问题描述 投票:0回答:3

从本质上讲,我试图创建一个程序,简单地接受来自用户的输入,然后打印,使用动态分配的内存。是的,我知道该怎么做这简单的方法,但我试图获得与内存管理的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; 
}
c
3个回答
2
投票

你的编译器应该是警告你这行:

printf_s("%s", *input);

如果没有,您需要启用的“所有警告”设置。 (开gcc和铛,-Wextra添加到命令行)。

从本质上讲,你的论点(char)的类型和格式字符串(const char*)期望的类型不匹配。 *input取消引用字符指针,所以计算结果为字符串中的第一个字符。 "%s"需要一个指向字符的空终止阵列。

如果您删除*它应该工作:

printf_s("%s", input);

1
投票

你可能希望这样的:

#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,因为它们不是每个平台或多或少毫无意义上的标准,只要使用scanfprintf


1
投票

您正在使用scanf_s("%s", ...错误。

逐字从the docs

更安全的功能(即具有_s后缀)和其他版本之间的主要区别是,更安全的功能所需要的大小在每个C,C,S,S,和[类型字段的字符作为一个参数传递立即可变以下。

所以,如果input点20 char序列的第一个字符,则应该是:

  scanf_s("%s", input, 20); 

经验教训:如果有疑问,(再)阅读文件!

© www.soinside.com 2019 - 2024. All rights reserved.