编程语言书籍解释了在堆栈上创建了值类型,并且在堆上创建了引用类型,而没有解释这两者是什么.我还没有看清楚这个问题.我理解堆栈是什么.但,
language-agnostic heap stack memory-management dynamic-memory-allocation
我理解malloc()是如何工作的.我的问题是,我会看到这样的事情:
#define A_MEGABYTE (1024 * 1024)
char *some_memory;
size_t size_to_allocate = A_MEGABYTE;
some_memory = (char *)malloc(size_to_allocate);
sprintf(some_memory, "Hello World");
printf("%s\n", some_memory);
free(some_memory);
Run Code Online (Sandbox Code Playgroud)
为简洁起见,我省略了错误检查.我的问题是,你不能通过初始化指向内存中某些静态存储的指针来做到这一点吗?也许:
char *some_memory = "Hello World";
Run Code Online (Sandbox Code Playgroud)
在什么时候你真的需要自己分配内存而不是声明/初始化你需要保留的值?
我不是C程序员,所以我不熟悉C-string但新的我必须使用C库,所以这里是我的代码的缩短版本来演示我的问题:
char** ReadLineImpl::my_completion () {
char* matches[1];
matches[0] = "add";
return matches;
}
Run Code Online (Sandbox Code Playgroud)
我收到警告:
警告 - 与返回的本地变量"matches"关联的堆栈内存的地址
我的应用程序似乎没有正常工作(可能是因为这个警告).
什么是警告,是否会引起任何问题?
我正在阅读有关在C中动态创建数组的信息.所以正如我所描述的那样:
int n;
scanf("%d", &n);
int *arr = (int*)malloc(n*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但后来我想如果我能做这样的事 -
int n, i, sum=0;
scanf("%d", &n);
int arr[n];
Run Code Online (Sandbox Code Playgroud)
我编译并运行它没有任何错误.所以,我的问题是我为什么要使用malloc()?这是否与旧版和新版C有关?