C语言动态扩容矩阵所有位置仅存储最后一个输入值是什么原因?
问题产生原因
- 核心逻辑错误为字符串赋值方式不对:你在main函数的输入循环中使用
matrix[words] = tmp_word;属于指针直接赋值操作,并非将输入的单词内容复制到矩阵对应的内存空间。tmp_word是栈上申请的固定长度字符数组,所有matrix数组的元素最终都指向同一块tmp_word的内存地址,每次新输入的单词都会覆盖tmp_word中原有的存储内容,因此读取矩阵所有位置得到的都是最后一次输入的结果。 - 额外存在的不规范编码隐患:在
create_matrix、matrix_reallocation函数中为单个字符串分配内存时,错误使用了sizeof(char*)作为单位,正确单位应该是sizeof(char),不过因为C标准中char类型默认占1字节,该问题暂时不会触发明显运行错误,但属于不规范写法。
修复方法
只需将输入循环中的指针赋值改为字符串内容拷贝即可,同时可以给fscanf增加长度限制避免输入溢出:
while (fscanf(stdin,"%1024s",tmp_word) != EOF){ // 把tmp_word中的内容复制到预先分配好的matrix[words]内存空间 strcpy(matrix[words], tmp_word); words++; printf("Words stored: %d, Capacity: %d\n", words, cap); if (words == cap){ printf("Limit reached, reallocating....\n"); matrix = matrix_reallocation(matrix, &cap); } }
内容的提问来源于stack exchange,提问作者Myxy290
相关产品推荐
相关产品推荐

