关于C语言指针的困惑:foo1函数段错误原因咨询
段错误成因分析:foo1与foo2的指针操作差异
你的foo1函数指针偏移逻辑完全错误,这是触发段错误的核心原因,对比foo2的正确写法就能清晰看出问题所在:
核心指针层级梳理
- main里的
ptr是char**类型,是你用malloc分配的、能存3个char*指针的数组。 - 传给foo1/foo2的
&ptr是char***类型,它是指向ptr这个二级指针变量的指针,本身只占一个指针的内存空间,指向的是ptr变量的地址,而非ptr数组的元素地址。
foo1的错误操作
foo1里的**(BufferArray+idx)犯了根本性的指针偏移错误:
BufferArray是char***类型,BufferArray+idx是对这个「指向二级指针的指针」做偏移,偏移步长是sizeof(char**)。- 当你传入idx=1时,
BufferArray+1指向的是&ptr地址往后跳一个指针大小的内存区域——这完全不是你malloc出来的ptr数组的地址,属于非法内存。对这个地址做两次解引用(**),直接访问了不属于程序的内存,自然触发段错误。
简单说:你把「指向二级指针的指针」和「二级指针本身」搞混了,本该操作ptr数组里的元素,结果错误操作了&ptr附近的非法内存。
foo2的正确逻辑
foo2的写法才是正确的指针操作:
- 先通过
char **temp=*BufferArray;取出char***指向的二级指针,也就是main里的ptr数组。 *(temp+idx)就是ptr数组中第idx个元素的地址,这才是你要分配内存的目标位置,对它做malloc和strcpy都是合法操作。- 最后
*BufferArray=temp;其实在这里是多余的(因为temp是ptr的副本,修改temp指向的数组元素不会改变temp本身),但写法逻辑是正确的。
额外需要修正的小问题
不管是foo1还是foo2,malloc(sizeof(char)*strlen(item))都少分配了1个字节:
strlen返回的是字符串的有效长度,不包含末尾的'\0'终止符,但strcpy会把'\0'也拷贝到目标内存里。- 正确写法应该是
malloc(strlen(item)+1),否则会导致内存越界,引发未定义行为。
内容的提问来源于stack exchange,提问作者synapsis
相关产品推荐
相关产品推荐

