Tag: 指针

将char数组转换为struct *类型

在下面的代码中,有人可能会解释行struct ether_header *eh = (struct ether_header *) sendbuf;上发生了什么struct ether_header *eh = (struct ether_header *) sendbuf; ? 我知道它正在创建一个类型为ether_header的指针eh ,并且在RHS上,您正在将sendbuf转换为tyoe struct ether_header的指针。 但是你怎么能这样做是sendbuf是一个char array ? 你也为什么要这样做? 这是完整代码发送以太网帧的链接 #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int sockfd; struct ifreq if_idx; struct ifreq if_mac; int tx_len = 0; char sendbuf[BUF_SIZ]; struct […]

使用指针编写strcat()时出错

我正在尝试The C programming Language by K&R学习C The C programming Language by K&R 。 我正在尝试使用指针编写strcat()程序。 char *strcat (char *s, char *t){ char *d; d = s; while(*s++); s–; while(*s++ = *t++); return d; } int main () { char *name1; char *name2; name1 = “stack” ; name2 = “overflow”; printf(“%s %s\n”, name1, name2); printf(“strcat out : […]

转换指针 – 运行时有什么区别?

请考虑以下小示例代码: #include #include int main() { int *i; char *c1, *c2; i = malloc(4); *i = 65535; c1 = i; c2 = (char *)i; printf(“%p %p %p\n”, i, c1, c2); printf(“%d %d”, *c1, *c2); free(i); return 0; } 在这个例子中,我分配内存来存储一个整数,由i指出。 然后,我将值65535(1111 1111 1111 1111)存储在*i 。 我接下来要做的是使两个char *指针也指向整数。 我做了两次,但是以两种不同的方式: c1 = i; 和c2 = (char *)i; 。 […]

C指针与Objective-C指针

我来自Objective-C背景,我正在尝试扩展我在C中的知识。然而,有一件事使我困惑,这就是C和Obj-C中指针之间的区别。 正如您在下面的示例中所看到的,两种语言之间的行为似乎有点不同,我想知道您是否可以帮助解释原因? C代码工作正常: void myFunction() { int x, *pointerX; pointerX = &x; *pointerX = 5; // Prints: “x is 5” printf(“x is: %i”, x); } Obj-C代码失败: – (void)myMethod { NSString *string = @”Caramel coffee”, *stringPointer; stringPointer = &string; // Warning: Assignemnt from incompatible pointer type *stringPointer = @”Chocolate milkshake”; // Exception: Incompatible types in assignment […]

初始化时是否需要调用pointer = NULL?

当我创建一个指向某个结构的指针时,我是否必须将其设置为NULL,然后分配它然后使用它? 为什么?

指针数学与数组索引

我知道这已经过了很多次,但是今天我遇到了一个案例,震惊了我对指针数学/数组索引的理解。 正如我总是理解的那样,&mybuff [10]和(&mybuff + 10)是重新记忆相同内存的方法。 但是我花了一个上午打架的案例: memcpy(&mybuff+10,&in,8); 当使用优化编译时,溢出缓冲区,并且在编译用于调试时工作得很好。 而在同一时间, memcpy(&mybuff[10],&in,8); 在这两种情况下工作得很好。 非常感谢任何想法或指针。

使用printf(%x)为什么指针的值不同?

#include int main(void) { int *ptr; printf(“The Hex value of ptr is 0x%x”,ptr); printf(“The pointer value of ptr is %p”,ptr); } 输出有点不同,我不知道为什么 The Hex value of ptr is 0x24a77950 The pointer value of ptr is 0x7fff24a77950 它显示ptr的值是hex整数,但hex输出缺少部分7fff 。 这是printf格式问题还是别的什么?

指针减法和替代

使用数组时,标准算法(在C和C ++中)通常会返回指向元素的指针。 有时可以方便地获得元素的索引,也许是为了索引到另一个数组,我通常通过从指针中减去数组的开头来得到它: int arr[100]; int *addressICareAbout = f(arr, 100); size_t index = addressICareAbout – arr; 这总是看起来简单而有效。 但是,最近我指出指针减法实际上返回了一个ptrdiff_t ,原则上,如果“ index ”不适合ptrdiff_t ,可能会出现问题。 我真的不相信任何实施都会有足够的反对意见,允许一个人创建如此大的arr(从而引起这样的问题),但是这里接受的答案承认这是可能的,而且我没有发现任何其他证据。 因此,我已经辞职了(除非有人能说服我),并且会小心前进。 那个答案提出了一个相当复杂的“安全”获取索引的方法; 真的没有更好的吗? 也就是说,我对C ++中可能的解决方法感到困惑。 我们有std::distance ,但std::distance(arr, addressICareAbout)保证定义明确吗? 一方面,(指向第一个元素的指针) arr可以递增到达addressICareAbout (对吗?),但另一方面std::distance应该返回一个ptrdiff_t 。 标准容器的迭代器可能(可能)具有相同的问题。

从指针中取消值

我很长时间没有做过指针运算,所以我想我会尝试用C做一个简单的二叉搜索树。 但是,我无法理解删除。 这些方面的东西像我期望的那样起作用: typedef struct Node{ int value; struct Node *left; struct Node *right; }Node; typedef struct Tree{ struct Node* root; }Tree; int main(){ Tree *tree = createTree(); treeInsert(10, tree); // Inserts 10 at root treeInsert(30, tree); // Inserts 30 to root->right treeInsert(5, tree); // Inserts 5 to root->left treeInsert(7, tree); // Inserts 7 to […]

如何将数组从函数返回到main

我必须使用该函数打开文件,读取它,将第一个值保存为以下元素(维度)的数量以及seq[]数组中的其他值。 我不知道如何在main中返回dimension和seq[] ; 我需要它,因为我必须在其他函数中使用这些值。 如代码所示,函数返回维度(dim),但我不知道如何返回数组。 #include #include #include #include int leggiSequenza(char *nomeFile, int *seq) { FILE *in; int i; int dim; if((in = fopen(nomeFile, “r”))==NULL) { printf(“Error.\n”); return -1; } fscanf(in, “%d”, &(dim)); printf(“Find %d values.\n”, dim); if(dim < 0) { printf("Errore: negative value.\n"); return -1; } seq = (int*) malloc(dim*sizeof(int)); i=0; while(!feof(in) && i<(dim)) […]