Tag: 内存

为指针及其数据分配的内存在哪里?

我的问题是我是否有一些function void func1(){ char * s = “hello”; char * c; int b; c = (char *) malloc(15); strcpy(c,s); } 我认为s指针是在堆栈上分配的,但是存储的数据“hello”在程序的数据段中是什么? 至于c和b它们是单元化的,因为’c =一些内存地址’而它没有一个但它是如何工作的? 和b也没有内容所以它不能存储在堆栈上? 然后当我们在堆上为c分配内存时,malloc c现在有一些内存地址,如果给定堆上该字符串的第一个字节的地址,这个单元化的c变量怎么样?

未对齐的内存访问

我正在玩C中的内存地址,并想知道这个名为未对齐内存访问的主题。 我目前使用的是带有Linux内核的x86英特尔,但是本着主题和操作系统不可知论的精神来讨论这个主题 – 尽管以下是Linux和HW特定的: 当我从/向未对齐的地址读取/写入简单类型时,我没有错。 日志或任何内容中没有消息。 我也尝试过: perf top -e alignment-faults # And with PID perf top -p NNN -e alignment-faults 但没有命中。 通过以下方式启用对齐检查 __asm__(“pushf\norl $0x40000,(%esp)\npopf”); 给出“通缉”结果: Bus error (core dumped) (但仍然没有消息) 我的问题是硬件+操作系统如何处理这个问题以及什么是最佳的。 我的想法和问题到处都是,但我会试着说出一些具体的观点: CPU是否默认启用了对齐检查,但是内核检测到支持off并指示它不检查 ? 作为内核,至少我在其他硬件上经历过这种情况,由于某些驱动程序试图访问未对齐的内存,可以获得oops:内核是否运行在对齐检查 -mode? 或者它可能只是代码的某些部分呢? 由于未对齐内存的访问需要更多资源; 在软件的测试阶段,启用对齐检查是一个好主意,例如在assembly线之上? 这会使它更便携吗? 我对此有很多疑问,但现在就把它留在这里。

为什么此代码中的缓冲区溢出与我的预期不同?

我有这个程序: #include #include #include void main(void) { char *buffer1 = malloc(sizeof(char)); char *buffer2 = malloc(sizeof(char)); strcpy(buffer2, “AA”); printf(“before: buffer1 %s\n”, buffer1); printf(“before: buffer2 %s\n”, buffer2); printf(“address, buffer1 %p\n”, &buffer1); printf(“address, buffer2 %p\n”, &buffer2); strcpy(buffer1, “BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB”); printf(“after: buffer1 %s\n”, buffer1); printf(“after: buffer2 %s\n”, buffer2); } 哪个印刷品: before: buffer1 before: buffer2 AA address, buffer1 0x7ffc700460d8 address, buffer2 […]

如何与其他进程共享现有的char *?

我正在尝试使用shmget和shmat与其他forked + execed进程共享一些内存: char test[]=”test”; int shID; char *shptr; key_t shkey = 2404; shID = shmget(shkey, sizeof(char)*(strlen(test)+1), IPC_CREAT | 0666); if (shID >= 0) { shptr = shmat(shID, 0, 0); if (shptr==(char *)-1) { perror(“shmat”); } else { memcpy(shptr, &test, strlen(test)+1); …. //forking and execing …. shmdt(shptr); } } else { perror(“shmget”); } 这很好用。 问题是test[]将成为一个巨大的char* […]

C中的钻石arrays排序

我在C中有以下作业。我基本上需要一种方法而不是解决方案。 我们有一个13 x 13arrays。 在arrays中,我们需要考虑钻石形状。 钻石之外的所有东西都被初始化为-1(不重要)。 示例5 x 5arrays – xx 1 xxx 2 2 2 x 3 3 3 3 3 x 4 4 4 x xx 5 xx x=-1 现在在这个数组中,每个条目的菱形中的值包含11位。 5 lsb包含一个数据(色调),另外6个包含另一个数据(直径)。 我们需要逐行地对数据进行排序,对于色调进行单调排序,然后逐列地对直径进行单调排序。 这样做最有效和最节省内存的方法是什么? 因为我们需要保存这个,所以最好是交换条目而不是创建另一个数组。 最后,我们将得到一个排序的钻石arrays(仍然是-1s)。 非常感谢你们!

使用字符串文字处理char * init时崩溃,但不使用malloc处理崩溃

我今天正在读一本关于C的书,它提到以下是真的; 我很好奇为什么要让这个程序validation; 然后最终在这里发布,所以比我聪明的人可以教我为什么这两个案例在运行时是不同的。 该问题的细节与运行时之间的差异有关,如何处理(char *)是基于它是否指向创建为文字的字符串与使用malloc和手动填充创建的字符串。 为什么内存分配的内存更像这样保护? 另外,答案是否解释了“总线错误”的含义? 这是我写的一个程序,询问用户是否想要崩溃,以说明程序编译正常; 并强调在我的脑海中,两个选项中的代码在概念上是相同的 ; 但那就是为什么我在这里,要明白为什么他们不是。 // demonstrate the difference between initializing a (char *) // with a literal, vs malloc // and the mutability of the contents thereafter #include #include #include int main() { char cause_crash; char *myString; printf(“Cause crash? “); scanf(“%c”, &cause_crash); if(cause_crash == ‘y’) { myString = […]

分配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 […]

了解内存分配的C代码示例

我是C的新手,我正在阅读K&R的“The C Programming Language”来学习它。 我对第2版第109页上出现的这个示例函数有疑问: /* readlines: read input lines */ int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || p = alloc(len) == NULL) return -1; else { line[len-1] = ‘\0’; /* delete newline */ strcpy(p, […]

stack&realloc问题C ++

int main() { char myString = NULL; realloc(&myString, 5); strncpy((char *)&myString, “test”, 5); } 似乎工作正常,但我仍然有点困惑堆栈与堆,这是允许的吗? myString是否需要手动释放,还是在超出范围时被释放? 编辑:感谢您的回复,所以我认为这同样是非法的 //I want the code to change myString to “tests” char myString[5] = “test”; realloc(&myString, strlen(myString)+2); myString[4] = ‘s’; myString[5] = ‘\0’;