有什么办法可以不用使用动态内存分配吗?
#include <stdio.h>
int main() {
char* str = NULL;
scanf("%s", str);
printf("%s\n", str);
}
答案 0 :(得分:6)
根据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;
}
会做这份工作。
答案 1 :(得分:0)
这种方式:
int main()
{
char str[100];
scanf("%s", str);
printf("%s\n", str);
}
答案 2 :(得分:-1)
是的,但是您将浪费内存,否则就有违反段关联的风险:
const { foo: [ firstFoo ], bar: [firstBar ]} = x;