为何无法通过解引用int指针作为索引访问字符指针数组?
问题根源与解决方案
你的代码核心问题出在assign函数的循环变量定义上:
for(int *i=0;*i<2;(*i)++){ arr[*i]=ele1; }
int *i=0是将指针i初始化为空指针(NULL),此时对*i进行解引用(读取或修改值)属于C语言中的未定义行为。程序在第一次尝试读取*i判断循环条件时,就已经触发了非法内存访问,后续的(*i)++更是试图修改空指针指向的内存区域,这会直接导致程序崩溃、报错或出现不可预测的运行结果。
而注释掉的循环代码:
for(int i=0;i<2;i++){ arr[i]=ele1; }
之所以能正常运行,是因为i是普通的int变量,存储在合法的栈内存空间中,对它的读写操作都是符合内存规则的合法行为。
你认为“仅赋值2个元素不应出现未定义行为”,但问题的本质不在赋值操作本身,而是循环变量的初始化和读写逻辑已经违反了内存访问规范——未定义行为的表现是不可控的,哪怕在某些场景下看似“正常”,也属于错误的代码逻辑。
修正方案
如果一定要用指针作为循环变量,需要先给指针分配合法的内存空间,比如让它指向一个栈上的int变量:
int assign(char **arr,char *ele1){ int val = 0; int *i = &val; for(;*i<2;(*i)++){ arr[*i]=ele1; } return 0; // 补充函数返回值,原代码缺少返回会触发编译警告 }
内容的提问来源于stack exchange,提问作者neo
相关产品推荐
相关产品推荐

