C语言向二维数组写入字符串出现modifiable lvalue错误如何解决?
错误原因
你定义的buffer2是char [5][1000]类型的二维数组,buffer2[write2]对应的是长度为1000的字符数组的首地址,属于不可修改的左值,C语言语法不允许直接对数组名进行赋值操作,所以buffer2[write2] = updatedStr;这种给数组首地址赋值的写法会直接触发编译错误。
修复方案
把报错行替换为字符串拷贝操作即可,同时补充缺失的缓冲区操作逻辑:
pthread_mutex_lock(&mutex2); // 用strncpy避免缓冲区溢出,最多拷贝999个字符,预留最后一位存储结束符 strncpy(buffer2[write2], updatedStr, 999); buffer2[write2][999] = '\0'; // 如果你自行实现的str_replace函数是动态申请内存返回的,拷贝完成后要释放对应内存避免泄漏 free(updatedStr); // 更新write2指针,移动到下一个可写位置 write2 = (write2 + 1) % 5; // 发送条件信号通知消费buffer2的线程有新数据可用 pthread_cond_signal(&readyBuffer2); // 操作完buffer2后释放对应的互斥锁 pthread_mutex_unlock(&mutex2);
其他注意点
- 你当前的
pthread_cond_wait没有搭配谓词判断,存在虚假唤醒的风险,建议修改为先判断buffer1是否存在未处理数据,再进入等待逻辑 - 注意互斥锁的加锁解锁顺序,避免死锁:你现在在持有mutex1的情况下加mutex2的锁,要保证所有线程加锁顺序都遵循先加mutex1再加mutex2的规则
- 内层循环的
buffer1[read1][0] != -1判断逻辑要和写入buffer1的逻辑对应,确保哨兵值的读写规则一致
内容的提问来源于stack exchange,提问作者Jorge Jones
相关产品推荐
相关产品推荐

