一名学生问了这个问题,我不确定.
猜测包括:"计数","清算","分块","完整",......
标准库文档没有说明它代表什么,并且没有类似命名的函数来指示模式.有没有人知道实际的词源,也许有一个权威的参考来支持它?
我想用C程序读取用户的输入.我不想使用数组,
char names[50];
Run Code Online (Sandbox Code Playgroud)
因为如果用户给出长度为10的字符串,那么剩余的空间就会被浪费掉.
如果我使用字符指针,
char *names;
Run Code Online (Sandbox Code Playgroud)
那么我需要以这样的方式为它分配内存,
names = (char *)malloc(20 * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,也存在内存浪费的可能性.
所以,我需要的是为字符串动态分配内存,该字符串与字符串的长度完全相同.
让我们假设,
如果用户输入是"stackoverflow",那么分配的内存应该是14(即字符串的长度= 13和'\ 0'的1个额外空间).
我怎么能实现这个目标?
我一直在阅读有关malloc当您请求零大小的块时的行为的讨论.
我理解malloc(0)是实现定义的行为,它应该返回一个空指针,或者我仍然不应该访问的非空指针.(这是有道理的,因为不能保证它指向任何可用的内存.)
但是,如果获得这样一个不可访问的非空指针,我是否允许以free通常的方式传递给它?或者这是非法的,因为我得到的指针malloc(0)可能不指向实际分配的内存块?
具体而言,以下代码是否具有明确定义的行为:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* x = (int*) malloc(0);
if (x == NULL) {
printf("Got NULL\n");
return 0;
} else {
printf("Got nonnull %p\n", x);
}
free(x); // is calling `free` here okay?
}
Run Code Online (Sandbox Code Playgroud) 这些天我有很大的ram,我想知道,有可能分配一块大于4GB的单块内存吗?或者我需要分配一堆较小的块并处理它们之间的切换?
为什么???我正在处理一些openstreetmap xml数据,这些文件非常庞大.我目前正在流式传输,因为我无法将它们全部加载到一个块中,但我对malloc或new的上限感到好奇.
我目前正在浏览http://code.google.com/p/stanford-cs193g-sp2010/上的教程示例以学习CUDA.__global__下面给出了演示功能的代码.它只创建了两个阵列,一个在CPU上,一个在GPU上,用7号填充GPU阵列,并将GPU阵列数据复制到CPU阵列中.
#include <stdlib.h>
#include <stdio.h>
__global__ void kernel(int *array)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
array[index] = 7;
}
int main(void)
{
int num_elements = 256;
int num_bytes = num_elements * sizeof(int);
// pointers to host & device arrays
int *device_array = 0;
int *host_array = 0;
// malloc a host array
host_array = (int*)malloc(num_bytes);
// cudaMalloc a device array
cudaMalloc((void**)&device_array, num_bytes);
int block_size = 128;
int grid_size = num_elements / block_size;
kernel<<<grid_size,block_size>>>(device_array); …Run Code Online (Sandbox Code Playgroud) 当我malloc在C程序中使用时,我收到警告:
warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]
Run Code Online (Sandbox Code Playgroud)
然后我可以包括<malloc.h>或<stdlib.h>摆脱warning它虽然它没有它也可以工作.
所以我想知道,gcc当我不包含任何内容时,这些标题之间有什么区别?
(我使用ubuntu 12.04 64-bit同gcc 4.6.3)
特定
struct node
{
int a;
struct node * next;
};
Run Code Online (Sandbox Code Playgroud)
要malloc一个新的结构,
struct node *p = malloc(sizeof(*p));
Run Code Online (Sandbox Code Playgroud)
比...更安全
struct node *p = malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)
为什么?我以为他们是一样的.
当我们使用malloc()分配内存时,我们应该给出两个幂的大小吗?或者我们只是给出我们需要的确切尺寸?
喜欢
//char *ptr= malloc( 200 );
char *ptr= malloc( 256 );//instead of 200 we use 256
Run Code Online (Sandbox Code Playgroud)
如果给出2的幂的大小更好,那是什么原因?为什么更好?
谢谢
编辑
我混淆的原因是在Joel的博客Back to Basics中引用
智能程序员通过始终分配大小为2的内存块来最小化malloc的潜在破坏.你知道,4个字节,8个字节,16个字节,18446744073709551616个字节等.由于任何使用乐高的人都应该直观的原因,这可以最大限度地减少自由链中发生的奇怪碎片的数量.虽然看起来这似乎浪费了空间,但也很容易看出它永远不会浪费50%以上的空间.所以你的程序使用的内存不会超过它需要的两倍,这不是什么大不了的事.
对不起,我应该早点发布上面的报价.我很抱歉!
到目前为止,大多数回复都说,以2的力量分配内存是一个坏主意,那么在哪种情况下更好地遵循Joel的观点malloc()呢?他为什么这么说?以上引用的建议现在已经过时了吗?
请解释一下.
谢谢
我一直对此感到好奇 - 为什么在C++中我必须从mallocC而不是在C中转换返回值?
以下是C++中的示例:
int *int_ptr = (int *)malloc(sizeof(int*));
Run Code Online (Sandbox Code Playgroud)
以下是C++中不起作用的示例(无转换):
int *int_ptr = malloc(sizeof(int*));
Run Code Online (Sandbox Code Playgroud)
我听说在C中,事实上,输出输出malloc()是一个错误.
任何人都可以评论这个话题吗?
我的iOS应用程序存在很大问题:它有时会在没有详细调试错误的情况下崩溃.堆栈跟踪为空.这些是堆栈跟踪中仅有的两行:
在com.apple.main-thread.
Xcode调试器上的错误(连接设备):
malloc: *** error for object 0x208a7614: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
我在malloc_error_break中使用libsystem_c.dylib设置了断点,没有来自调试器的任何反馈.我不知道要解决这个问题.