当使用malloc并进行类似的内存操作时,我可以依赖sizeof(char)始终为1吗?
例如,我需要为N个元素类型分配内存char.是否sizeof( char )需要乘以:
char* buffer = malloc( N * sizeof( char ) );
Run Code Online (Sandbox Code Playgroud)
或者我可以依赖sizeof(char)始终为1并且只是跳过乘法
char* buffer = malloc( N );
Run Code Online (Sandbox Code Playgroud)
我完全理解sizeof在编译期间进行评估,然后编译器甚至可以编译出乘法,因此性能损失将是最小的并且很可能为零.
我主要询问代码清晰度和可移植性.这种乘法对于类型是否必要char?
可能重复:
有关malloc和sizeof的新手问题
我正在尝试将字符串读入程序.当我注意到字符串有时被破坏时,我尝试了以下代码:
void *mallocated = malloc(100);
printf("sizeof(mallocated) = %d\n", sizeof(mallocated));
Run Code Online (Sandbox Code Playgroud)
根据我的程序,大小mallocated是8,即使我为它分配了100个字节.因此,每当我尝试存储长度超过8个字节的字符串时,第8个字节后的所有内容有时会消失.为什么会发生这种情况,我该如何预防呢?
我正在尝试将大型(1.4GB)Git存储库克隆到具有384MB RAM的32位Debian VM.我正在使用Git 1.7.2.5,并使用SSH协议进行克隆('git clone user@host.com:/ my/repo')
克隆因此消息失败:
remote: Counting objects: 18797, done.
remote: warning: subobtimal pack - out of memory
remote: Compressing objects: 100% (10363/10363), done.
fatal: out of memory, malloc failed (tried to allocate 905574791 bytes)
fatal: index-pack failed
Run Code Online (Sandbox Code Playgroud)
我已经尝试减少Git用于在主机存储库端重新打包并重新打包的内存量:
git config pack.windowMemory 10m
git config pack.packSizeLimit 20m
git repack -a -d
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
在任何一种情况下,我能做些什么来使克隆成功吗?在线的许多潜在解决方案涉及以下部分/全部内容,在这种情况下,这些都不可接受:
提前致谢.
安装:
bzip2 -d valgrind-3.10.1.tar.bz2
tar -xf valgrind-3.10.1.tar
Run Code Online (Sandbox Code Playgroud)
然后:
./configure
make
make install
Run Code Online (Sandbox Code Playgroud)
或者更简单
sudo apt-get install valgrind
Run Code Online (Sandbox Code Playgroud)
如何在这个简单的程序example1.c上运行valgrind
#include <stdlib.h>
int main()
{
char *x = malloc(100); /* or, in C++, "char *x = new char[100] */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
跑:
valgrind --tool=memcheck --leak-check=yes example1
valgrind: example1: command not found
Run Code Online (Sandbox Code Playgroud)
控制台输出:
valgrind: example1: command not found
Run Code Online (Sandbox Code Playgroud) 我在讲座中被教过,free()两次拨打指针真是非常糟糕.我知道NULL在释放它之后立即设置指针是一种很好的做法.
但是,我仍然没有听到任何解释为什么会这样.根据我的理解,方式malloc()有效,它应该在技术上跟踪它已经分配的指针并让你使用.那么为什么它不知道它接收到的指针是否free()已被释放?
当你打电话free()给以前已经被释放的位置时,我很乐意理解,内部会发生什么.
鉴于这个用gcc 4.3.3编译的C代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
int * i;
i = (int *) malloc(sizeof(int));
printf("%d\n", *i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望输出是malloc()返回的内存中的任何内容,而输出是0. malloc是否将它返回的内存归零?如果是这样,为什么?
我想分配一个矩阵.
这是唯一的选择:
int** mat = (int**)malloc(rows * sizeof(int*))
for (int index=0;index<row;++index)
{
mat[index] = (int*)malloc(col * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud) 在C++中使用delete释放所获得的内存malloc()并不一定会导致程序爆炸.
如果delete用于释放使用的内存,是否应该产生警告或甚至断言失败malloc()?
为什么Stroustrup在C++上没有这个功能?
我在哪里可以找到我的gcc编译器目前使用的malloc代码?我实际上想编写自己的malloc函数,它与原版函数略有不同.我知道我可以使用hooks等等,但我希望看到真正的代码.