鉴于我需要在结构中存储“generics”指针的值并且对指向的内存本身没有兴趣,我发现将它存储为intptr_t不是void*语义上更正确。 问题是uintptr_t是否更适合,并且当一个人比另一个更优先时?
昨天我上课了,在某个时候讲师正在谈论C代码。 他说: 在C中制作指针的目的是什么? 唯一的目的是使编译器正确解释指针操作(例如,添加int指针将导致与添加char指针不同的偏移量)。 除此之外,没有区别:所有指针在内存中的表示方式相同,无论指针指向int值,char值,short值等等。 因此,转换指针不会修改内存中的任何内容,它只会帮助程序员执行与他正在处理的指针类型更相关的操作。 但是,我已经阅读,特别是在Stack Overflow中,这不是100%真实。 我已经读过,在一些奇怪的机器中,不同类型的指针可以以不同的方式存储在内存中。 在这种情况下,如果将代码编译为此类机器,则不将指针更改为正确的类型可能会导致问题。 基本上,这是我正在谈论的那种代码。 考虑以下代码: int* int_pointer; char* char_pointer; int_pointer = malloc(sizeof(int)); *int_pointer = 4; 现在有两种选择: 1。 char_pointer = (char *)int_pointer; 2。 char_pointer = int_pointer; 案例2的代码可能成为一个问题? 制作演员表(案例1)最终会改变内存中的指针格式(如果是的话,你能给出一个机器的例子吗?)? 谢谢
这听起来像是一个愚蠢的问题,但我还在学习C,所以请耐心等待。 🙂 我正在研究K&R(结构)的第6章,到目前为止,这本书已经取得了巨大的成功。 我决定使用结构非常重要,因此在本章的早期就使用了point和rect示例做了很多工作。 我想尝试的一件事是通过指针改变canonrect函数(第2版,第131页),因此返回void 。 我有这个工作,但遇到了打嗝,我希望你们可以帮助我。 我希望canonRect创建一个临时矩形对象,执行其更改,然后重新分配它传递给临时矩形的指针,从而简化代码。 但是,如果我这样做,矩形不会改变。 相反,我发现自己手动重新填充我传入的矩形字段,这确实有效。 代码如下: #include #define min(a, b) ((a) (b) ? (a) : (b)) struct point { int x; int y; }; struct rect { struct point lowerLeft; struct point upperRight; }; // canonicalize coordinates of rectangle void canonRect(struct rect *r); int main(void) { struct point p1, p2; […]
好吧,这对我来说太麻烦了。 我只是不知道这个任务有什么问题: void *pa; void *pb; char *ptemp; char *ptemp2; ptemp = (char *)pa; ptemp2 = (char *)pb; 任何人都可以告诉我为什么我收到此错误: 错误:从’void *’到’char *’的无效转换
有人可以向我解释/给出一个推理,为什么变量i在主函数中的值在下面的代码片段中不会通过函数test1改变,而它确实通过test2改变了? 我认为单个指针应该足以改变i的值。 为什么我们应该使用双指针? #include void test1(int* pp) { int myVar = 9999; pp = &myVar; } void test2(int** pp) { int myVar = 9999; *pp = &myVar; } int main() { printf(“Hej\n”); int i=1234; int* p1; p1 = &i; test1(p1); printf(“does not change…, p1=%d\n”,*p1); test2(&p1); printf(“changes…, p1=%d\n”,*p1); return 0; }
几乎每次我跳回C项目时,我都会这么说。 在尝试访问结构中的结构时,我遇到了段错误。 假设我有一个游戏的以下(简化)结构: struct vector { float x; float y; }; struct ship { struct vector *position; }; struct game { struct ship *ship; } game; 以及初始化船舶的function: static void create_ship(struct ship *ship) { ship = malloc(sizeof(struct ship)); ship->position = malloc(sizeof(struct vector)); ship->position->x = 10.0; } 然后在main()中: int main() { create_ship(game.ship); printf(“%f\n”, game.ship->position->x); // <– SEGFAULT […]
关于glibc中string.h中strlen的实现,我有两个问题。 该实现使用带有’holes’的幻数。 我无法理解这是如何工作的。 有人可以帮我理解这个片段: size_t strlen (const char *str) { const char *char_ptr; const unsigned long int *longword_ptr; unsigned long int longword, himagic, lomagic; /* Handle the first few characters by reading one character at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = str; ((unsigned long int) […]
我知道我们有不同的指针,如int , float和char 。 void指针是唯一可以容纳所有其他指针的指针。 其他指针是否存在只是为了灵活地进行指针运算? C语言中是否存在除void之外的指针还有其他原因吗?
我正在尝试在C中构建一个内存分配器。用户首先要说明他想要使用多少内存,以及可以提供的最小内存块大小。 因此,举例来说,假设用户请求最小块大小为8B的1024B。 这意味着可能的块大小将是1024,512,256,128,64,32,16和8。 为了跟踪空闲的内存块,我有一个结构指针数组。 这些结构称为Header,该数组称为FreeList。 我的意思是FreeList [0]将包含一个指向内存空间的指针,其中有一个内存块大小为8. FreeList [1]将包含一个指向内存空间的指针,其中有一块内存大小为16等等 typedef void * Addr; struct Header { Addr next; int order; }; struct Header *FreeList[]; 我正在尝试为此空闲列表分配内存以使用以下代码: FreeList = malloc(Order*sizeof(struct Header)); 其中Order是您可以拥有的不同块大小的数量。 我收到编译错误’FreeList’的类型不完整。 我不希望这些指针指向任何地方,我只想为数据分配空间。
使用realloc时内存是否自动释放? 或者是否有必要免费使用realloc? 以下哪项是正确的? //Situation A ptr1 = realloc(ptr1, 3 * sizeof(int)); //Situation B ptr1 = realloc(ptr2, 3 * sizeof(int)); free(ptr1); ptr1 = ptr2;