LinuxC编程中常见的段错误(非法操作内存)情形

char* s="AAA";

printf("%s",s);

s[0]='B';

printf("%s",s);

有什么错?

"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。

cosnt char* s="AAA";

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

#include<stdio.h>

int main(void)

{

    char *ptr = "Linux";

    *ptr = 'T';

    printf("\n [%s] \n", ptr);

    return 0;

}解析:有错误,指针ptr指向常量区空间,内存数据不允许修改*ptr=’T’错误

#include <stdio.h>

void func(char a[10])

{

char c = a[3];

}

int main()

{

char b[10] = "abcdefg";

func(b[10]);

return 0;

}

解析: 这里至少有两上严重错误,

第一,b[10]并不存在,在编译的时候,由于没有去实际地址取值,所以没有出 错。但在运行的时,将计算b[10]的实际地址,并且取值。这时候发生越界错误。

第二,func函数会将传入的char类型的数据当作地址处理,同样会发生错误 。

void test1()

{

char string[10];

char* str1 = "0123456789";

strcpy(string, str1);

}

解答:字符串str1有11个字节(包括末尾的结束符'\0'),而string只有10个字节,故而strcpy会导致数组string越界。

void test2()

{

char string[10], str1[10];

int i;

for(i=0; i<10; i++)

{

    str1[i]= 'a';

}

strcpy(string, str1);

}

解答:因为str1没有结束符'\0',故而strcpy复制的字符数不确定。

char *GetMemory( void )

{

char p[] = "hello world";

return p;

}

void Test( void )

{

char *str = NULL;

str = GetMemory();

printf(str);

}

解答:GetMemory中,p为局部变量,在函数返回后,该局部变量被回收。故而str仍为NULL;

char *memcpy( char *dest, const char *src,int len )

{

char* pDest = (char*)dest;

char* pSrc = (char*)src;

int pos;

for(pos=0;pos<len;pos++)

{

pDest[pos] = pSrc[pos];

}

return (char*)pDest;

}

解析:错误1:未对传入指针进行判断assert(dest !=NULL || src != NULL);

  错误2:返回栈内指针,函数调用后指针空间释放,易造成内存非法访问

### Killed 错误的原因分析 在 IT 场景下,“Killed”通常表示某个进程被操作系统终止。这种行为可能由多种因素引起,具体取决于上下文环境。 #### 1. **资源耗尽** 当系统检测到某些资源(如内存、CPU 时间片或其他硬件限制)已被过度占用时,操作系统的 OOM(Out of Memory)管理器会主动杀死消耗最多的进程以保护整个系统的稳定性[^1]。这种情况常发生在运行大型计算任务或数据密集型应用时。 #### 2. **权限问题** 如果尝试访问未授权区域或者执行非法指令,则可能导致段错误(Segmentation Fault),最终表现为“killed”。例如,在 C/C++ 编程中越界读写数组元素就会引发 SIGSEGV 信号并强制退出程序。 #### 3. **多线程或多进程中的异常情况** 对于 Python 的 PyTorch 数据加载器(Dataloader),如果设置了过多的 `num_workers` 参数而机器本身可用共享内存不足的话,也可能收到类似于“worker was killed by signal”的报错消息[^2]。这是因为子进程中存在竞争条件或是其他同步机制失效所造成的崩溃现象。 #### 4. **网络连接中断** 在网络通信领域比如数据库交互过程中,长时间等待响应却得不到结果亦或者是中间链路断开等情况均有可能造成客户端接收到类似“Lost connection...during query”的提示信息,并伴随有“killed”字样出现[^3]。 --- ### 解决方案建议 针对上述提到的各种可能性提供相应的解决方案如下: #### 资源优化 - 检查当前服务器状态,确认是否有足够的剩余空间供应用程序使用; - 如果发现确实是因为 RAM 不足而导致的服务停止工作,则考虑升级硬件配置或将部分运算转移到云端完成; #### 权限调整与代码修正 - 审核所有涉及指针操作的地方确保不会发生越权存取动作; - 使用现代高级别的编程语言自带的安全特性来规避低级错误的发生几率; #### 配置合理参数设置 - 对于深度学习框架而言适当减少并发数量(`num_workers`)可以有效缓解因争夺有限资源带来的负面影响; - 同样也可以通过增加交换分区大小等方式间接提升整体性能表现从而避免频繁遭遇此类状况; #### 增强网络健壮性设计 - 设置合理的超时时间防止无限期挂起; - 实施重试逻辑以便应对偶尔发生的瞬态故障情形; --- ```python import os def check_memory_usage(): """获取Linux系统上的内存利用率""" with open('/proc/meminfo', 'r') as f: meminfo = dict((i.split()[0].rstrip(':'),int(i.split()[1])) for i in f.readlines()) total_mem = meminfo['MemTotal'] free_mem = meminfo['MemFree'] + meminfo['Buffers'] + meminfo['Cached'] used_percentage = ((total_mem - free_mem)/total_mem)*100 return round(used_percentage,2) if __name__ == "__main__": usage_percent = check_memory_usage() print(f"Current memory usage percentage:{usage_percent}%") if usage_percent >=85 : raise Exception('High Memory Usage Detected! Please optimize your program.') ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值