C语言中将字符串转整数存入int**类型变量不报转换警告的实现方法
问题原因
int** 本质是指向int类型指针的指针,你申请的num_list是一个长度为10的数组,数组里每个元素num_list[i]的类型是int*(int类型指针),而atoi()的返回值是int类型的整数值,直接将int值赋值给指针类型变量,就会触发你收到的类型不匹配警告。你需要先为每个int值申请独立的内存空间,再让num_list[i]指向该空间,最后把转换后的整数存入对应的内存地址中。
正确实现代码
#include <stdlib.h> int main() { // 外层申请10个int*类型的空间,和你的原有逻辑一致 int** num_list = malloc(10 * sizeof(int*)); if (num_list == NULL) { // 内存申请失败处理,可根据自己的需求调整 return 1; } for(int i = 0; i < 10; i++) { // 先为每个int值申请内存空间 num_list[i] = malloc(sizeof(int)); if (num_list[i] == NULL) { // 申请失败时要释放已经申请的内存,避免内存泄漏 for(int j = 0; j < i; j++) { free(num_list[j]); } free(num_list); return 1; } // 解引用指针,把转换后的整数存入对应的内存地址 *num_list[i] = atoi("1234"); } // 业务逻辑使用阶段,例如要读取第i个值直接用*num_list[i]即可 // ... // 释放内存的正确顺序:先逐个释放内层的int空间,再释放外层的指针数组 for(int i = 0; i < 10; i++) { free(num_list[i]); } free(num_list); return 0; }
注意事项
- 如果需要读取存储的整数值,直接对
num_list[i]解引用即可,即*num_list[i] - 若输入的字符串可能存在非合法整数的场景,建议使用
strtol()替代atoi()做转换,可以做异常校验,避免未定义行为 - 务必按照先释放内层元素、再释放外层数组的顺序释放内存,否则会出现内存泄漏
内容的提问来源于stack exchange,提问作者tenepolis
相关产品推荐
相关产品推荐

