有没有办法在不使用动态内存分配的情况下做到这一点?
#include <stdio.h>
int main() {
char* str = NULL;
scanf("%s", str);
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
按照Cstandard(C11)没有直接的方法,但是,POSIX将可选的赋值分配字符定义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;
}
Run Code Online (Sandbox Code Playgroud)
会做的.