Tag: 内存管理

获取指针数据的大小

我尝试了以下代码,以了解如何获取指针数据的大小: #include #include #include int main(){ char *test_char_ptr = “This is just a test”; int *test_int_ptr = (int *) malloc(16*sizeof(int)); for(int i = 0; i<16; i++){ test_int_ptr[i] = i; } printf("%s\n",test_char_ptr); printf("Test char 1: %d\n", (int)sizeof test_char_ptr ); printf("Test char 2:%d\n", (int)sizeof *test_char_ptr ); printf("Test char 3: %d\n", (int)((strlen(test_char_ptr)+1) * sizeof(char))); printf("Test int 1:%d\n", (int)sizeof […]

在C中调整2D数组的大小

目前我正在尝试使用此代码片段在C中调整2D数组的大小 array = (int**) realloc(array, s * 2 * sizeof(int)); 其中s是行和列中数组的大小。 但是,当试图像这样访问数组的新区域时, array[3][0] = x; 我只得到一个段错误。 arrays的旧区域工作正常。 我该如何解决这个问题?

将&符号应用于C / C ++或任何其他此类语言的变量或数据类型时返回的是什么类型的地址?

从我听说OS类中的虚拟和物理内存概念这一天起,这是一个非常基本的问题令人难以置信。 现在我知道在加载时和编译时,虚拟地址和逻辑地址绑定方案是相同的,但在执行时它们是不同的。 首先,为什么在编译和加载时生成虚拟地址以及在我们应用&号运算符来获取变量,天真数据类型,用户定义类型和函数定义地址的地址时返回什么是有益的? 操作系统如何完全从虚拟地址映射到物理地址? 这些问题都是出于好奇心而且我会喜欢考虑现代操作系统的一些好的和深刻的见解’,早期的操作系统是怎样的’。我只是特定于C / C ++,因为我对其他语言知之甚少。

在C中将内存分配给char ***

所以,我在为char ***类型变量分配内存时遇到了麻烦。 我的目标是创建一个字符串矩阵,我目前用于内存分配的代码如下: char ***matrix; matrix = calloc(n*MAX_STR, sizeof(char**)); for(z = 0; z < n; z++) { matrix[z] = calloc(n, sizeof(char*)); for(i = 0; i < MAX_STR; i++) { matrix[z][i] = calloc(MAX_STR, sizeof(char)); } } 我已成功为字符串数组分配内存,使用: char **list; list = calloc(n, sizeof(char *)); for (j = 0; j < n; j++){ list[j] = calloc(MAX_STR, sizeof(char)); […]

使用realloc缩小分配的内存

关于C中的realloc函数的简单问题:如果我使用realloc来缩小指针所指向的内存块,那么“额外”内存是否会被释放? 或者是否需要以某种方式手动释放? 例如,如果我这样做 int *myPointer = malloc(100*sizeof(int)); myPointer = realloc(myPointer,50*sizeof(int)); free(myPointer); 我会有内存泄漏吗?

现代处理器上的内存对齐?

我经常看到如下代码,例如,在内存中表示一个大位图: size_t width = 1280; size_t height = 800; size_t bytesPerPixel = 3; size_t bytewidth = ((width * bytesPerPixel) + 3) & ~3; /* Aligned to 4 bytes */ uint8_t *pixelData = malloc(bytewidth * height); (也就是说,一个位图被分配为一个连续的内存块,其字节bytewidth与一定数量的字节对齐,最常见的是4.) 然后通过以下方式给出图像上的一个点: pixelData + (bytewidth * y) + (bytesPerPixel * x) 这引出了两个问题: 对齐像这样的缓冲区会对现代处理器产生性能影响吗? 我应该担心对齐,还是编译器会处理这个问题? 如果它确实有影响,有人可以指向我找到各种处理器的理想字节对齐的资源吗? 谢谢。

函数返回char指针

我遇到了很多函数在一个遗留应用程序中返回char指针。 其中一些返回指向本地字符数组的指针。 它似乎是在几次调用(不是立即!)之后导致崩溃,请参阅下面的用法 char *f1(){ char buff[20]; char *ptr; —- —- ptr=buff; return ptr; } — — f2(f1()); f1()返回一个指针局部变量,然后将其传递给另一个函数。 当我在MS DEV中使用_DEBUG模式编译时,我直接崩溃了。 但是在发布模式下,它不会导致立即崩溃,但可能会在进行大量此类调用后发生。 当我修改下面的用法时,它没有任何问题。 以下用法是否安全? strcpy(arr,f1()); /* arr is fixed char array*/ f2(arr);

堆栈内存上的free()

我在Solaris上支持一些c代码,至少我认为它是奇怪的: char new_login[64]; … strcpy(new_login, (char *)login); … free(new_login); 我的理解是,由于变量是本地数组,因此内存来自堆栈而不需要释放,而且由于没有使用malloc / calloc / realloc,因此行为未定义。 这是一个实时系统,所以我认为这是一个浪费周期。 我错过了一些明显的东西吗

C中的bss段

在关于 “ 关于Unix中的bss段和数据段 ”的问题的答案之一中,我看到对bss的解释如下: Bss是特殊的:.bss对象不占用目标文件中的任何空间,并且通过将未特别初始化的所有符号分组在一起,可以很容易地将它们一次归零。 但是当我在目标文件上使用size时,生成的代码: #include int uninit_global_var; int init_global_var=5; int main() { int local_var; return 0; } 我有以下内容 text data bss dec hex filename 1231 280 12 1523 5f3 a.out 并根据具有全局范围的未初始化数据成员查看bss的增长情况。 那么有人可以certificate上述陈述的合理性吗?

使用realloc是否安全?

前段时间,我的一位朋友告诉我不要使用realloc,因为它不安全,但他不能告诉我为什么,所以我对这个问题做了一些研究,最接近我怀疑的是: https://buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/809-BSI.html http://www.iso-9899.info/wiki/Why_not_realloc 我想知道我是否可以继续在我的代码中使用realloc,或者它是否不安全是否还有其他方法来重新分配内存? 感谢您的关注。