Tag: 指针

来自`strsep`的字符串标记不打印(seg fault)

我正在使用较小的代码来测试较大(初学者)程序的function,但是我在显示我从字符串中拉出的令牌时遇到了问题。 我找到并使用了: #include #include int main() { char *string, *found; string = strdup (“1/2/3”); printf(“Original string: ‘%s’\n”,string); while ((found = strsep(&string,”/”)) != NULL ) printf (“%s\n”,found); return (0); } 这工作正常,一次打印一个令牌作为字符串。 然后当我尝试移动到用户输入的字符串时: #include #include int main() { char string[13]; char *found, *cp = string; fprintf(stderr, “\nEnter string: “); scanf(“%12s”,string); printf(“Original string: ‘%s’\n”,string); while((found = strsep(&cp,”/,-“)) != […]

C – 具有前后增量的指针行为

在我做C指针的一些实验,并试图了解它的行为。 以下是我对以下代码的假设。 如果我错了,请纠正我。 我有以下代码: int n[5] = {3,6,9,12,15}; int *ptr = n; ptr++; printf(“%d”, *ptr); //Needless to say, the output will be 6 我的假设 :上面的输出是6,因为ptr++表示ptr = ptr + 1我正在改变ptr的值 ,它是n[0]的地址 。 现在我们来看看以下场景: int n[5] = {3,6,9,12,15}; int *ptr = n; *ptr++; printf(“%d”, *ptr); //Why is the output still 6? 我的问题是:我们如何解释*ptr++ ? 这是否意味着: * ptr = […]

malloc()缓冲区太小

我问这个问题来磨练我的知识。 我在下面写了一份测试代码。 char *ptr1的大小是malloc(1) 。 我在3行上复制5个字。 共有32个字符长度。 输出很顺利。 我浏览了strncat()函数的代码。 它似乎也没有为复制目的分配额外的内存。 我也没有在ptr1 char指针的末尾添加任何空字符。 这怎么能产生正确的结果? 那是对的吗? int main(void) { char *name = “First Set”; char *ptr1; ptr1 = malloc(1); // <<== here the memory is allocated only 1 byte joinWithMe(ptr1, name); // <<== 9 bytes are copied printf("PTR1 : %s\n", ptr1); joinWithMe(ptr1, "-Second Set"); // <<== 11 […]

可以保护未存储初始地址的堆对象免受垃圾回收吗?

假设 我正在修改别人的C程序; 垃圾收集器处于活动状态; 堆上有一个对象,我不希望垃圾收集器收获; 和 对象一直存在,直到程序退出,所以没有必要释放()它。 我必须存储对象的初始地址吗? 假设我不关心初始地址。 假设我只关心对象内部的一些指针,并且这些指针都是我存储的。 假设我扔掉了初始地址。 垃圾收集器会收获我的对象吗? 附加信息 据我所知,该程序现在不收集垃圾。 但是,如果程序的未来版本开始收集垃圾,那么我今天添加的代码可能会突然变成一个难以发现的错误。 我不想做一个难以发现的错误; 但该计划是一个古老而稳定的计划,已有数千名用户使用多年。 因此,已知程序在各种实际条件下可接受地起作用。 重新设计不是一种选择。 该程序采用全球数据结构,它从不困扰free()。 这是我必须在其中工作的设计。 如果你想知道:我希望存储的指针 – 指向其对象内部的指针 – 碰巧指向ASCII字符串中的单词。 我只关心单词,而不是整个字符串。 特别是,我不关心字符串开头的空格,这就是为什么我不关心字符串的初始地址; 但垃圾收集者可能会无意中关心,可能不是吗? 存储一个链接的指针列表似乎很愚蠢,我和其他任何人都不会使用它,只是为了抵挡一个不存在的假设垃圾收集器; 但如果真的有必要,我会存储清单。 或者我的担忧是没有根据的? 无论如何,没有人会向旧的C程序添加垃圾收集吗?

如果我的指针穿过数组边界会发生什么?

我在下面创建了一个代码,我需要跟踪一个数组,增加指向数组的指针,并在数组结束时停止。 我使用下面的代码测试,显然在增加ptr和打印*ptr 1000次迭代之后,我得到0作为值。 那么数组的最后一个元素总是0是真的吗? 如果动态创建数组长度(我不允许使用链接列表),如何告诉ptr停在最后一个元素? 我担心,如果我使用下面的代码,有一天我会遇到printf i = 1000,它会返回我随机的内存位置(对于下面的代码,它不是真的,但是谁知道)… #include int my_array[] = {1,23,17,4,-5,100}; int *ptr; int main(void) { int i; ptr = &my_array[0]; /* point our pointer to the first element of the array */ printf(“value of ptr is %d\n”, *ptr); for(i=0; i<1000; i++){ ptr++; } printf("value of ptr is now %d", *ptr); return […]

指向数组第一个元素的指针的地址?

我是一个迷茫的指针,它指向一个指向数组开头的指针。 根据我的理解,数组和指针可以使用相同的函数,如*,&和[]。 所以,如果我创建一个char数组,我理解:buffer ==&buffer [0]。 所以没有括号的arrayname就像一个包含数组第一个条目地址的指针,对吧? 但是当我试图找出指针的地址(其中存储&buffer [0]的地址)时,它将给出与指针(&arrayname [0])中存储的相同的值。 怎么可能? 虚拟RAM中的相同地址如何包含一个地址和buffer [0]的值(在下面的代码中等于’H’)? #include #include void main() { char buffer[] = “Hello”; printf(“Address buffer: %d\n”, &buffer); printf(“Value buffer: %d\n”, buffer); printf(“Address buffer[0]: %d\n”, &buffer[0]); printf(“Value buffer[0]: %c\n”, buffer[0]); printf(“Address buffer[1]: %d\n”, &buffer[1]); system(“pause”); } 所以基本上我对第一个输出感到困惑。 不应该与第二个不同吗? 非常感谢您的解释…… 问候

使用qsort对2D数组进行排序时发出警告

我正在尝试使用qsort在C中对2D数组进行排序。排序有效,但我收到警告: warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default] 如何修改比较函数以消除警告(假设qsort需要参数const void *pa, const void *pb ? int cmp (const void *pa, const void *pb ) { const int (*a)[2] = pa; // warning here const int (*b)[2] = pb; // warning here if ( (*a)[1] (*b)[1] ) return -1; return 0; […]

为什么这个程序不是段错误?

当我为gcc启用-O时,导致输出“Hello”的原因是什么? 它不应该仍然是段错(根据这个维基 )? % cat segv.c #include int main() { char * s = “Hello”; s[0] = ‘Y’; puts(s); return 0; } % gcc segv.c && ./a.out zsh: segmentation fault ./a.out % gcc -O segv.c && ./a.out Hello

Postgres C函数 – 传递和返回数字

我刚刚开始使用Postgres外部C函数进行测试。 当我传入一个数字并返回它时,该function正常。 (例) 样本函数 PG_FUNCTION_INFO_V1(numericTesting); Datum numericTesting(PG_FUNCTION_ARGS) { Numeric p = PG_GETARG_NUMERIC(0); PG_RETURN_NUMERIC(p); } 但是,当我尝试对传入的变量执行任何数学函数时,它将无法编译。 我明白了 错误:二进制文件的操作数无效* 样本函数 PG_FUNCTION_INFO_V1(numericTesting); Datum numericTesting(PG_FUNCTION_ARGS) { Numeric p = PG_GETARG_NUMERIC(0); PG_RETURN_NUMERIC(p * .5); } 是什么造成的? 我猜测Numeric数据类型需要一些函数来允许数学。 我尝试使用:PG_RETURN_NUMERIC(DatumGetNumeric(p * .5)),但结果相同。

为指针及其数据分配的内存在哪里?

我的问题是我是否有一些function void func1(){ char * s = “hello”; char * c; int b; c = (char *) malloc(15); strcpy(c,s); } 我认为s指针是在堆栈上分配的,但是存储的数据“hello”在程序的数据段中是什么? 至于c和b它们是单元化的,因为’c =一些内存地址’而它没有一个但它是如何工作的? 和b也没有内容所以它不能存储在堆栈上? 然后当我们在堆上为c分配内存时,malloc c现在有一些内存地址,如果给定堆上该字符串的第一个字节的地址,这个单元化的c变量怎么样?