Tag: memcpy

避免多类型结构的memset

我想避免在这样的结构上使用memset() : typedef struct { int size; float param1; } StructA; typedef struct { StructA a; unsigned int state; float param2; } Object; 我可以做这样的事情(伪代码,我现在无法检查)? Object obj; int *adr = (int*)&obj; for (int i; i < sizeof(obj); i++) { *adr++ = 0; } 它会将obj的每个成员设置为零吗? 编辑 :回答有关评论的问题。 我一直在研究一些情况(使用uni-type结构),其中memset比手动初始化慢两倍。 所以我会考虑尝试初始化多类型结构。 避免使用memcpy()也会很好(避免使用 lib)。

为什么restrict限定符仍允许memcpy访问重叠内存?

我想看看restrict是否会阻止memcpy访问重叠内存。 memcpy函数将n个字节从内存区域src 直接复制到内存区域dest。 内存区域不应重叠。 memmove使用缓冲区,因此不存在重叠内存的风险。 restrict限定符表示,对于指针的生命周期,只有指针本身或直接来自它的值(如pointer + n )才能访问该对象的数据。 如果未遵循意图声明并且该对象由独立指针访问,则将导致未定义的行为。 #include #include #define SIZE 30 int main () { char *restrict itself; itself = malloc(SIZE); strcpy(itself, “Does restrict stop undefined behavior?”); printf(“%d\n”, &itself); memcpy(itself, itself, SIZE); puts(itself); printf(“%d\n”, &itself); memcpy(itself-14, itself, SIZE); //intentionally trying to access restricted memory puts(itself); printf(“%d\n”, &itself); return (0); } 输出() […]

gcc优化复合语句

我在c中为通用可resize的向量实现push_back运算符时遇到问题。 对于通用性,我需要使用void指针作为参数,但实际上我想直接给它赋值。 当我使用gcc -ot test.c -std=c99编译下面的代码时,它会按照我的预期打印10 。 当我向编译选项添加-O1 (或更高版本)时,程序将打印0 。 我认为问题在于smemcpy代码,因为当我用memcpy替换它时我不再有这个问题。 简化代码: #include #include #define get_pointer(value) ({ __typeof__(value) tmp = value; &tmp; }) // copy from src to dst byte by byte void* smemcpy(void* dst, void const * src, size_t len) { char * pdst = (char *) dst; char const * psrc = (char […]

c – 尝试编写修改后的结构时出现分段错误

这是一个旨在使用ppm图像文件的程序。 我在尝试修改结构然后将其写入新文件时遇到编译错误。 这是全局结构(在ppmIO.c和ppmIO.h中声明): ppmIO.c: struct Image *instance; ppmIO.h: struct Image { int width; int height; unsigned char *data; }; extern struct Image *instance; 这是我的imageManip.h文件: #include void ImageInvert(struct Image **toInvert); void ImageSwap(struct Image **toSwap); 这些是我的imageManip.c文件的相关部分: #include #include #include #include #include void ImageInvert(struct Image **toInvert) { int i; int pix = (*toInvert->width) * (*toInvert->height); *toInvert = realloc(*toInvert, […]

memcpy导致’exc bad access’

我试图循环一个数组并复制数据,但在1023循环后,我得到一个exc bad access消息抛出,我感觉它可能与我的记忆有关。 在我的循环中,我需要将数据附加到我的totalValues数组,所以我这样做: memcpy(totalValues + totalCopied, tempBuffer, 600 * sizeof(float)); 这是在一个循环中完成的,并且totalCopied会跟踪已经将多少数据附加到totalValues以便我知道在循环再次点击memcpy时从哪里写入。 我不确定为什么会出现“错误访问”错误,但我的理论是内存不连续,因此, totalValues + totalCopied行可能会造成麻烦。 我不确定在这种情况下是否会抛出错误,或者无论如何都会覆盖内存。 有趣的是,它总是发生在1023循环之后。 如果我删除’memcpy’行,程序循环没有任何问题。 可能导致这种情况的任何想法? 编辑 – 原因是内存分配是硬编码为另一个文件。 通常,在内存分配之前我不知道文件的长度,那么如何确保在运行时分配足够的内存?

memcpy()从较小的数组到较大的数组

我找不到任何关于这个问题的提法。 我有一个结构数组,我需要resize的数组。 两个结构都已完全初始化(每个单元格的值都不是NULL) 说 typedef struct Square { … … }Square; Square s1[1024]; Square s2[2048]; 如果我使用memcpy() s1复制到s2中,s2会怎么样? 我知道它复制字节数据。 将前1024个单元格与s1相同,剩下的1024个单元格将在初始化时生效吗? 还是会影响他们? 谢谢 PS这里的数组是静态分配的,但我写的只是为了方便。 我使用malloc()分配它们

在C中为字符数组添加一个是什么?

我正在查看一些用于学习目的的代码。 我正在研究这部分代码。 // eg const unsigned char data={0x1,0x7C … } unsigned char buf[40]; memset(buf,0,40); buf[0] = 0x52; memcpy(buf+1, data, length); // What does buf+1 do in this situation? 在调用memcpy的最后一行,buf + 1做了什么? buf是一个字符数组,所以+1会对它做什么?

使用memcpy与直接方法复制结构数组

假设pp是指向长度为n的结构数组的指针。 [动态分配]假设我想创建该结构数组的副本并使用它的指针,方法如下: struct someStruct* pp2 = malloc(_appropriate_size_); memcpy(pp2, pp, _appropriate_length_); 我也可以做一个循环并为0 <= i <= n做pp2[i]=pp[i] 。 这些方法有什么区别,哪个更好,为什么?

memcpy导致EXC_BAD_ACCESS

我正在将别人的C ++转换为(Objective)C,但我遇到了memcpy的问题。 我用它如下: memcpy((void *)virtualFlash[virtualFlashAddress], data, dataLength); 变量定义如下: unsigned char virtualFlash[5 * 1024 * 1024]; // 5MB NSUInteger virtualFlashAddress; // set to 8 later on unsigned char *data = (unsigned char *)[recordData bytes]; // recordData is an NSData object NSUInteger dataLength = [recordData length]; // same NSData object 我在memcpy的行上得到一个EXC_BAD_ACCESS。 我调试了recordData ,返回 ,dataLength返回16 – 两者都正确。 memcpy((void*)virtualFlash[8], […]

memmove真的“移动”了一大块内存并在源头留下了零吗?

可能重复: memcpy vs memmove memmove真的“移动”了一大块记忆吗? 如果是这样,它会留下内存零吗? 或者,它就像memcpy ? 我正在查看手册页,我不相信我的假设是正确的。 如果我想使用memmove移动一块内存,我是否必须手动将我移动的内存块清零?