Tag: malloc

分配6xNxNarrays

我有一个变量N 我需要一个6xNxNarrays。 像这样的东西: int arr[6][N][N]; 但是,显然,这不起作用。 我不知道如何分配这个以便我可以访问,例如arr[5][4][4]如果N是5,而arr[5][23][23]如果N是24 。 请注意, N永远不会改变,所以我永远不必重新分配realloc arr 。 我该怎么办? 将int ***arr = malloc(6 * N * N * sizeof(int)); 工作?

C中的GetTotalMemory分配

我想在调用函数之前和之后分配总内存,以确定我是否已正确释放所有内容。 我在C中这样做,我很生疏,所以如果这是一个天真的问题请原谅我。 我正在寻找类似于C#GC.GetTotalMemory(true)的东西,现在在Windows中。 现在我正在使用PROCESS_MEMORY_COUNTERS_EX和GetProcessMemoryInfo(…) ,在调用函数之前和之后但是我无法对输出做出正面或反面,因为如果我进入函数并注释掉一个free(…)的调用free(…)然后它会给我相同的结果(之后总是更大)。 这就是我现在所拥有的…… GetProcessMemoryInfo(hProc, &before, sizeof(before)); r = c->function(); GetProcessMemoryInfo(hProc, &after, sizeof(after)); if(r->result != 0) { printf(“error: %s\r\n”, c->name); printf(” %s\r\n”, r->message); printf(” %s (%d)\r\n”, r->file, r->line); failed++; } else if(after.PrivateUsage > before.PrivateUsage) { printf(“memory leak: %s\r\n”, c->name); printf(” %d kb\r\n”, after.PrivateUsage – before.PrivateUsage); failed++; } else succeeded++; 得到这样的结果: after.PrivateUsage – before.PrivateUsage […]

time.h适用于C ++,而不适用于C语言

代码: #include “stdafx.h” #include “stdio.h” #include “math.h” #include “stdlib.h” #include “time.h” int main() { time_t start, end; time (&start); int i; double dif; /*int serie[100000];*/ /* int *serie = malloc( sizeof(int) ); for (i = 0; i <= 100000; i++) { *serie(i)=rand(); printf("%d \n", serie[i]); } */ time (&end); dif = difftime (end, start); printf […]

初始化2Darrays时出现分段错误

我已经检查过我的代码正确地划分了内存空间,但是一旦我尝试将我的2D数组初始化为某些值然后总结这些值,我就会在2×2数组上收到分段错误。 我想最终将我的代码扩展到更大的数组,但我甚至无法在这里工作。 我知道关于malloc和2D数组有很多关于分段错误的post,但由于我的C知识刚刚开始,我一直无法找到一个帮助我解决问题的post。 您可以给予任何帮助,或者如果您能指出我之前的问题,将不胜感激。 谢谢! #include #include #include int main() { double sum=0; int i,j; int N = 2; double **array; array = malloc(N * sizeof(double *)); if(array == NULL) printf(“Failure to allocate memory.\n”); for(i=0; i<=N; i++) { array[i] = malloc(N * sizeof(double)); if(array[i] == NULL) { printf("Failed to allocate memory for arr[%d].\n", i); exit(0); […]

为什么没有内存泄漏?

以下内容旨在获取一个可变长度的常量char,并以一种很好的格式打印出来以进行日志记录。 我相信读者会对如何改进这方面提出建议,我对此表示欢迎。 令我困惑的是,我希望每次调用ToHexString()时都需要free()返回的静态char。 相反,我认为没有任何内存泄漏。 即使我使用内联函数,因此也不会将其返回值赋给变量。 我创建了一个简单的测试,在循环中调用此函数,每次使用不同长度的cString和nMaxChars参数。 然后我看了VM的状态。 我的测试程序和可用内存的内存分配从未改变。 在我看来,每次调用malloc并且没有空闲时它应该增加。 static char *ToHexString(const char *cString,int nMaxChars) { static char *cStr; /*if (80>strlen(cString)) nRawChars=strlen(cString); if (nMaxChars>nRawChars) nRawChars=nMaxChars; */ if (nMaxChars==0) nMaxChars=80; printf(“There are %i chars\n”,nMaxChars); char *cStr1; char *cStr2; char *cStr3; int nLen=nMaxChars*6; cStr=calloc(nLen,sizeof(char)); cStr1=calloc(10,sizeof(char)); cStr2=calloc(nLen,sizeof(char)); cStr3=calloc(nLen,sizeof(char)); cStr1[0]=’\0′; cStr2[0]=’\0′; cStr3[0]=’\0′; int nC1=0; int nRowCnt=0; for (nC1=0;nC1<nMaxChars;nC1++) { […]

SIGSEGV,(貌似)由printf引起

首先,对任何交叉发布道歉。 希望我不是在这里重复一个问题,但我无法在其他地方找到这个问题(通过Google和Stack Overflow)。 这是错误的要点。 如果我在代码中的任何地方调用printf , sprintf或fprintf来显示浮点数,我会收到SIGSEGV (EXC_BAD_ACCESS)错误。 让我举个例子。 以下引发错误: float f = 0.5f; printf(“%f\n”,f); 此代码不: float f = 0.5f; printf(“%d\n”,f); 我意识到那里有隐含的转换,但我并不关心这一点。 我只是无法理解为什么打印浮点数而不是打印整数会产生错误。 注意:部分代码使用malloc来创建一些非常大的多维数组。 但是,这些打印语句不会以任何方式引用这些数组。 这是我如何声明这些数组的示例。 #define X_LEN 20 #define XDOT_LEN 20 #define THETA_LEN 20 #define THETADOT_LEN 20 #define NUM_STATES (X_LEN+1) * (XDOT_LEN+1) * (THETA_LEN+1) * (THETADOT_LEN+1) #define NUM_ACTS 100 float *states = (float *)malloc(NUM_STATES […]

C中的字符串和指针

#include #include #include int main(void) { char* a = malloc(5 * sizeof(char)); a = “1”; free(a); } 关于上面的代码我有两个问题: 当我初始化这样的代码时,为什么代码会给free(a)带来错误: a =“1” 并且在我初始化这样的时候不会给free(a)带来任何错误: a [0] =’1’。 当我使用[0] =’1’初始化a并使用printf(“%s”,a)打印字符串a为什么我得到结果 ‘1’ 没有用’\ 0’声明第二个索引?

如何从C中的新虚拟页面分配内存?

我正在分析在创建维度PageSize x PageSize的二维数组时跨虚拟页面分配的效果。 我的机器的页面大小是4096.我有一个4096个整数指针(列)的数组,指向4096个整数(行)。 我想在新的虚拟页面开始分配第一个整数指针。 如何识别当前内存位置是否为新页面? 有一次,我已经确定了,我相信我可以写一些垃圾值并将指针移动到一个新的虚拟页面。 这就是我分配数组的方式。 array = malloc(ncolumns * sizeof(int *)); for(j = 0; j < ncolumns; j++) { array[j] = malloc(nrows * sizeof(int)); if(array[j] == NULL) { reportError(8);} }

C中的malloc内存分配方案

我在C中试验了malloc,我观察到malloc在分配了一些内存后浪费了一些空间。 下面是我用来测试malloc的代码片段 #include #include int main(){ char* a; char* b; a=malloc(2*sizeof(char)); b=malloc(2*sizeof(char)); memset(a,9,2); memset(b,9,2); return 0; } 在下图的右中间(为清晰起见,在新选项卡中打开图像),您可以看到内存内容; 0x804b008是变量’a’指向的地址,0x804b018是变量’b’指向的内存。 从0x804b00a 0x804b017到内存发生了什么? 即使我尝试分配3*sizeof(char)而不是2*sizeof(char)字节的内存,内存布局是相同的! 那么,有什么我想念的吗?

我释放后仍然可以打印一个字符串?

我正在学习和测试C中的内存分配,我想测试如果调用free()会发生什么。 我预计在运行下面的程序后可能会出现分段错误或指针为NULL 。 但是,我仍然可以像输出一样成功打印字符串。 我还尝试将str释放两次,然后在输出2发生时出现错误。 似乎先前分配的内存已成功解除分配,但内存中的数据未被清除。 那是对的吗? 如果是这种情况,程序什么时候会清理那些解除分配的内存空间? 如果数据被解除分配但没有清理,那是否安全? 上述任何问题的答案都会有所帮助! 谢谢! 码 #include #include int main() { printf(“Hello, World!\n”); char *str = (char *)malloc(24); char *str2 = “tutorialspoint”; strcpy(str, str2); free(str); printf(“[str] %s\n”, str); return 0; } 产量 Hello, World! [str] tutorialspoint 输出2 main(83218,0x7fff9d2aa3c0) malloc: *** error for object 0x7fb0b2d00000: pointer being freed was not […]