【问题记录】C语言一个程序bug定位记录?(定义指针数组忘记[])

背景

写了个小的程序,一直段错误。特此记录

代码

主要代码

bash 复制代码
int main_mytest(int argc, char *argv)
{
	char *argv_my = {
		"echo",
		"/proc/cpuinfo",
	};
	main_mytest(sizeof(argv_my)/sizeof(char*), argv_my);
}

int main_mytest(int argc, char *argv)
{
	printf("argc:%d, argv[0]:%s, argv[1]:%s\n", argc, argv[0], argv[1]");
	...
}

分析

这里只列举了简单的代码,一直段错误。一开始以为了自定了一个argv参数无法正确传递,实际不会。

然后debug的时候只打印1个参数printf("argc:%d, argv[0]:%s\n", argc, argv[0]");,还是报段错误。

然后看是否是argc不对,argc也是1。

但是既然是1,为什么只打印1个参数也段错误呢?

然后怀疑是不是局部变量被释放,可是子函数没执行完,不会出现。但还是实践一下,怀疑自己了。先搞成全局变量,结果还是不对。

bash 复制代码
	char *argv_my = {
		"echo",
		"/proc/cpuinfo",
	};
int main_mytest(int argc, char *argv)
{

	main_mytest(sizeof(argv_my)/sizeof(char*), argv_my);
}

最后发现,根本原因是:char *argv_my = {定义不对,应该定义一个字符串char *argv_my[] = {

如果定义为char *argv_myname,他指向的理论上是一个 char*的地址,然后地址的值具体是{}结构化初始化的结果。此时如果访问argv_my[1]肯定不对,这部分内存都未被分配。系统访问的时候,虚拟地址访问的时候都找不到这个地址。

综述

不错的一个细节,稍不注意就搞错了。

相关推荐
不爱吃炸鸡柳2 小时前
[特殊字符]C/C++内存管理深度解剖:从内存布局到new/delete底层,吃透面试必考核心
c语言·c++·面试
Lzh编程小栈3 小时前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
凉、介6 小时前
Flash 块设备驱动开发
c语言·驱动开发·笔记·学习·操作系统·嵌入式
itman3016 小时前
C语言字符串必知:末尾有个隐藏的\0,新手易踩坑
c语言·字符串·内存管理·库函数·指针操作
海参崴-7 小时前
C语言与C++语言发展历史详解
java·c语言·c++
kelleyv7 小时前
C语言为何跨平台难?编译后换系统就跑不了
c语言·java虚拟机·字节码·跨平台性·本地代码
一路向北he8 小时前
esp32库依赖
c语言·c++·算法
海参崴-8 小时前
深入剖析C语言结构体存储规则:内存对齐原理与实战详解
java·c语言·开发语言
小柯博客8 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(八)
c语言·git·stm32·单片机·嵌入式硬件·嵌入式·yocto
iFlyCai17 小时前
C语言中的指针
c语言·数据结构·算法