Tag: 指针

修改字符串时出现分段错误

我在这段代码中得到了分段错误错误,但不知道为什么? #include int main(void) { char *ptr = “Linux”; *ptr = ‘T’; printf(“\n [%s] \n”, ptr); return 0; }

关于C中指针和字符串的问题

可能重复: C中的char s []和char * s有什么区别? char * str =“…”和char str [N] =“……”之间的区别? 我有一些令我困惑的代码。 #include #include int main(int argc, char *argv[]) { char* string1 = “this is a test”; char string2[] = “this is a test”; printf(“%i, %i\n”, sizeof(string1), sizeof(string2)); system(“PAUSE”); return 0; } 当它输出string1的大小时,它打印4,这是预期的,因为指针的大小是4个字节。 但是当它打印string2时,它输出15.我认为数组是一个指针,所以string2的大小应该与string1相同吗? 那么为什么它为相同类型的数据(指针)打印出两种不同的大小呢?

正确的定义NULL和NULL_POINTER的方法?

据我所知, C定义NULL如下: #define NULL ( (void *) 0) 那么,我们应该如何定义NULL_POINTER ? 我在我的程序中将它定义为相同并且它有效,但我认为这只是一个巧合: #define NULL_POINTER ( (void *) 0) 如果有的话,逻辑定义是什么?

C警告:函数返回局部变量的地址

下面的函数采用argv [0]参数,该参数包含应用程序的调用路径,并替换最后一位,直到它遇到一个“/”,其中包含我要生成的新应用程序的名称,该应用程序位于同一文件夹中。 BTW:我正在声明一个全局argv变量,因此该函数可以访问它,因为我不想在每个函数调用中传递信息。 当我编译我的代码时,一切似乎都有效,但我得到了上述警告。 我知道我正在声明变量,并且只要函数返回它就会被销毁。 作为初学C程序员,我想知道解决这个问题的最优雅/最简单的方法是什么? 我应该将指针传递给函数或malloc一些内存吗? char *returnFullPath() { char pathToApp[strlen(argv[0])+1]; strcpy(pathToApp, argv[0]); int path_length = strlen(argv[0]); while (pathToApp[path_length] != ‘/’) { path_length–; } if (path_length > 2) pathToApp[path_length+1] = ‘\0’; else pathToApp[0] = ‘\0’; // length of getcwd + length of pathtoapp + 1 for zero plus 6 for “bidbot” char bidbotPath[strlen(getcwd(NULL,0)) + […]

减少指针超出范围; 将其增加到边界

以下是否会在第4行和/或第5行中引发未定义的行为: #include int main(void) { char s[] = “foo”; char * p = s – 1; /* line 4 */ printf(“%s\n”, p + 1); /* line 5 */ return 0; }

C中取消引用和括号引用的操作顺序

如果我做*ptr[x] ,那相当于*(ptr[x]) ,还是(*ptr)[x] ?

通过一个实际例子,数组和指针之间的异同

给出以下代码: #include #include int main() { int a[1]; int * b = malloc(sizeof(int)); /* 1 */ scanf(“%d”, &a); printf(“%d\n”, a[0]); /* 2 */ scanf(“%d”, &b); printf(“%d\n”, b[0]); return 0; } 编译时获得以下警告(i686-apple-darwin9-gcc-4.0.1): array.c: In function ‘main’: array.c:9: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int (*)[0u]’ array.c:14: warning: format ‘%d’ expects […]

“地址”(&)被忽略的数组/地址是gcc吗?

我是入门编程课程的助教,有些学生犯了这种错误: char name[20]; scanf(“%s”,&name); 这并不奇怪,因为他们正在学习……令人惊讶的是,除了gcc警告之外,代码也起作用(至少这部分)。 我一直在努力理解,并编写了以下代码: void foo(int *v1, int *v2) { if (v1 == v2) printf(“Both pointers are the same\n”); else printf(“They are not the same\n”); } int main() { int test[50]; foo(&test, test); if (&test == test) printf(“Both pointers are the same\n”); else printf(“They are not the same\n”); } 编译和执行: $ gcc test.c […]

通过易失性引用/指针访问声明的非易失性对象是否会在所述访问时赋予易失性规则?

这将是一个漫长的过程,关于它的上下文并提供尽可能多的信息,我必须蜿蜒通过各种链接和引用 – 这通常是我们进入C / C ++标准兔子洞后的唯一方法。 如果您对此帖有更好的引用或任何其他改进,请告诉我。 但是要事先总结一下, 你可以责怪@ zwol发布这个;-)并且目的是从两个命题中找到真相: 执行C和(通过导入;请参阅注释)C ++标准要求通过volatile *或volatile &访问必须引用最初声明为volatile的对象才能具有volatile语义? 或者是通过volatile指针/引用访问非易失volatile限定对象/应该使所述访问行为就像对象被声明为volatile ? 无论哪种方式,如果(看起来)措辞与意图相比有些含糊不清 – 我们可以在标准本身中明确说明吗? 这些相互排斥的解释中的第一个更常见,而且并非完全没有依据。 但是,我希望表明有大量的“合理怀疑”支持第二个 – 特别是当我们回到基本原理和WG论文中的一些先前的段落时。 接受的智慧:被引用的对象本身必须被声明为volatile 昨天流行的问题是“挥发性”这个波动的定义,还是GCC有一些标准的合规性问题? 通过假设一个volatile引用会给volatile volatile指示物带来volatile行为 – 但发现它没有,或者在不同程度上以不可预测的方式做出来。 接受的答案最初得出结论,只有宣称的指称类型才重要。 这个和大多数注释似乎都同意等效原则在我们对const很熟悉的情况下起作用:如果引用具有与引用对象相同的cv -qualification,则行为将只是volatile (或根本定义): 该段落中的关键词是对象。 volatile sig_atomic_t flag; 是一个易变的对象。 *(volatile char *)foo仅仅是通过volatile限定左值的访问,标准不要求具有任何特殊效果 。 – zwol 这种解释似乎被广泛持有,正如对这个相似但希望不重复的问题的回答所示: 指向易失性指向非易失性对象的行为要求但即使存在不确定性:紧接着答案是’不’,然后说’也许’! 无论如何……让我们检查一下标准,看看’没有’是什么。 标准所说的……或者不是 C11, N1548,§6.7.3 :很明显,通过不共享所述限定符的指针访问用 volatile或const类型定义的对象是UB … 6如果尝试通过使用具有非const qualifiedified类型的左值来修改使用const限定类型定义的对象,则行为未定义。 […]

Swift:将未初始化的C结构传递给导入的C函数

我知道这个答案 ,但这不是一回事 – 那就是传递一个指针,用分配初始化。 我正在与具有以下结构定义的C库连接: typedef struct myStruct { unsigned char var [50]; } myStruct; 有一个函数可以传递结构的地址 – 通常基于堆栈而不是堆,因此: myStruct mine; initMyStruct(&mine); 这会初始化结构的内容 – 调用者不知道内存的内部格式,因此混淆。 在Swift中,我正在创建一个类,它将封装结构和与其上运行的其他C函数的接口。 class MyClass { var mine : myStruct init() { initMyStruct(&mine) // Error: Variable ‘self.msg’ passed by reference before being initialized } } 我不能为我的生活弄清楚如何初始化结构,或者如果可以替代使用一个点。 mine = myStruct() // Fails because you […]