我知道为了比较C中的两个字符串,你需要使用strcmp()函数。 但我试着用==运算符比较两个字符串,它有效。 我不知道如何,因为它只是比较两个字符串的地址。 如果字符串不同,它应该不起作用。 但后来我打印了字符串的地址: #include #include int main() { char* str1 = “First”; char* str2 = “Second”; char* str3 = “First”; printf(“%p %p %p”, str1, str2, str3); return 0; } 输出是: 00403024 0040302A 00403024 Process returned 0 (0x0) execution time : 0.109 s Press any key to continue. str1和str3有多少可能具有相同的地址? 它们可能包含相同的字符串,但它们不是同一个变量。
我有一个函数返回地址如下 struct node *create_node(int data) { struct node *temp; temp = (struct node *)malloc(sizeof(struct node)); temp->data=data; temp->next=NULL; printf(“create node temp->data=%d\n”,temp->data); return temp; } struct node是哪里的 struct node { int data; struct node *next; }; 如何在printf(“”)中查看存储在temp中的地址? UPDATE 如果我检查gdb中的地址,则地址将以hex数格式显示,即0x602010,其中printf(“%p”,temp)相同地址的数字与我在gdb print命令中看到的数字不同。
是否可以初始化一个指向结构的指针数组? 就像是: struct country_t *countries[] = { {“United States of America”, “America”}, {“England”, “Europe”}, {“Ethiopia”, “Africa”} } 我想这样做是为了让实体在不连续的内存中,并在连续的内存中指向它们……但我不能使用动态内存,所以我想知道没有它是否可行。
在C中,如果我们有一个类似a[10]的数组,则a和&a具有相同的指针值(但不是相同的类型)。 我想知道为什么C这样设计? 这是为了节省存储所需的额外空间吗? ……当你想到a永远不会指向任何其他位置的事实时,这是有道理的,所以存储&a是没有意义的。
我有一个任意值的数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int ,字符数组等)。 但是,我如何实际为其分配一个int ? 以这些初始化为例: void* data[10]; int x = 100; 我的直觉会想到这一点,但这会产生编译错误: data[0] = malloc(sizeof(int)); *(data[0]) = x; 我还想过使用&x ,但我会取一个局部变量的地址,这个(据我所知)将在退出程序后被清除。 所以,如果我有一个局部变量x ,我怎样才能正确地将它变为void指针类型的变量?
这两行代码是否实现了相同的结果? 如果我在函数中有这些行,那么在两种情况下字符串都存储在堆栈中吗? 除了不需要在第一行代码中声明空终止符之外,我是否应该使用一个而不是另一个? char s[] = “string”; char* s = “string\0”;
对不起标题,我找不到用几句话来形容我的问题。 我已经知道swift可以使用c编写的struct。 例如 在Bridging-Header.h中 typedef struct { int x; int y; } Pointer; 然后我可以直接使用Pointer。 但就我而言,我有一个用C语言编写的库。有许多带有隐藏工具的结构。 例如: 在Briding-Header.h中 typedef struct Pointer Pointer; 我不能再使用Pointer了,得到了未知类型。 在我的库中,Pointer用作 create_pointer(Pointer **pointer); 任何帮助表示赞赏! PS我没有定义struct Pointer的.h文件。 关于Pointer的所有细节都是隐藏,例如通过函数访问它们 int getx(Pointer *pointer); 这是我的完整测试代码: user_input.c #include #include “user_input.h” struct Pointer { int x; int y; }; void get_user_input(int *user_input) { scanf(“%i”, user_input); } void init_pointer(Pointer *point) […]
我最近在向同事解释原因时感到很尴尬 char a[100]; scanf(“%s”, &a); // notice a & in front of ‘a’ 是非常糟糕的,稍微好一点的方法是: char a[100]; scanf(“%s”, a); // notice no & in front of ‘a’ 好。 对于每个人都准备告诉我为什么不应该出于安全原因使用scanf:放松。 这个问题实际上是关于“&a”与“a”的含义。 问题是,在我解释了为什么它不起作用之后,我们尝试了它(使用gcc)并且它起作用=))。 我赶紧跑了 printf(“%p %p”, a, &a); 它会打印两次相同的地址。 任何人都可以向我解释发生了什么事吗?
对于那些有课程开发经验的人:关于数组的最佳策略是什么? 我见过一些学校在变量和控制结构之后教授数组,甚至在教学function之前。 这允许教授一些基本的算法等。然而,它带来了如何将数组传递给函数的问题,因此有必要回到数组指针被教导和补丁。 另一个选择是从变量和控制结构转到函数,然后教指针,一旦你有指针,从头开始教数组,然后用它来进行动态内存分配。 对我来说第二个选项更有意义,因为与简单变量不同,使用数组很容易“超出范围”,但是尚未了解内存和指针的学生可能无法理解这些界限之外的内容。 但是,我很想知道其他人的想法。
我正在尝试使用数组(malloc-ed),即自定义结构的arr 。 通过引用函数传递数组。 每当我在运行时尝试索引除函数中的arr[0]以外的任何东西时,我会得到一个段错误(例如(*arr[1])->i = 3; )。 为什么会这样? 完整的源代码是: #include #include #define SIZE 100 typedef struct{ int i; float f; }foo; void doSomething(foo ***arr); int main() { foo **arr = (foo**) malloc (SIZE * sizeof(foo*)); int i; for(i = 0; i i = 1; printf(“Before %d\n”,arr[1]->i ); doSomething(&arr); printf(“After %d\n”,arr[1]->i ); return 0; } void […]