有没有办法在不使用动态内存分配的情况下做到这一点?
#include <stdio.h>
int main() {
char* str = NULL;
scanf("%s", str);
printf("%s\n", str);
}
根据C
标准(C11
)没有直接的方法,但是,POSIX defines可选的赋值分配字符m
作为转换说明符的一部分,它使程序员免于分配内存的责任。
但是,在引擎盖下,这确实使用了动态内存分配,您需要稍后在指针上调用free()
。
引用参考:
%c
,%s
和%[
转换说明符应接受可选的赋值分配字符'm'
,它将导致分配内存缓冲区以保存转换后的字符串,包括终止空字符。在这种情况下,对应于转换说明符的参数应该是对将接收指向分配的缓冲区的指针的指针变量的引用。系统应分配缓冲区,就像调用了malloc()
一样。应用程序应负责在使用后释放内存。如果内存不足以分配缓冲区,则该函数应将errno
设置为[ENOMEM]
,并产生转换错误。如果函数返回EOF
,则在函数返回之前,应释放通过此调用使用赋值分配字符'm'
成功分配给参数的任何内存。
就像是
#include <stdio.h>
#include <stdlib.h>
int main() {
char* str = NULL;
scanf("%ms", &str);
printf("%s\n", str);
free(str);
return 0;
}
会做的。
这条路:
int main()
{
char str[100];
scanf("%s", str);
printf("%s\n", str);
}
是的,但是你会浪费内存,或者有分段违规的风险:
#include <stdio.h>
int main() {
char str[512] = {0} // as suggested by Jabberwocky
//sprintf(str, "");
//scanf("%s", str); // protecting the input from more than 511 chars
scanf("%511s", str);
printf("%s\n", str);
}