C语言构造二进制字符串存入数组后仅保留最后一个值的问题
问题根源
- 你仅在循环执行前调用了1次
malloc申请内存,所有binaryStringArray的元素都指向同一块内存地址currentBinaryString - 每次循环中修改
currentBinaryString指向的内存内容时,实际是覆盖了所有数组元素共同指向的空间值,因此最终所有元素指向的内容都是最后一次构造的二进制串 - 你观察到的「仅
binaryStringArray[0]非空」是表象,本质是所有数组元素的指针值都和binaryStringArray[0]完全相同,指向同一块内存
修复方案
方案1:循环内申请独立内存
每次循环新申请一块独立内存存储当前构造的二进制串,后续使用完毕后需要逐个释放避免内存泄漏:
char *binaryStringArray[100]; for(int i = 0; i < n; i++) { char *currentBinaryString = malloc(33); // 移到循环内,每次申请新内存 // 此处调用strcpy完成currentBinaryString的构造 binaryStringArray[i] = currentBinaryString; } // 后续使用完后遍历释放内存 for(int i = 0; i < n; i++) { free(binaryStringArray[i]); }
方案2:使用二维字符数组避免动态内存申请
如果你的n最大不超过100、二进制串长度不超过32,可以直接用栈上的二维数组,无需手动管理内存:
char binaryStringArray[100][33]; char tempStr[33]; for(int i = 0; i < n; i++) { // 此处构造二进制串存入tempStr strcpy(binaryStringArray[i], tempStr); }
额外注意点
C语言字符串需要1字节存储结束符\0,如果你的二进制串最大长度为32个字符,建议申请33字节的内存,避免缓冲区越界。
内容的提问来源于stack exchange,提问作者Marcos
相关产品推荐
相关产品推荐

