C语言二维数组作为形参传递问题

2023-10-29

问题

今天想用一个二维字符串数组保存字符串,在参数传递过程中发现返回的结果不对,上网一搜,发现二维数组作为形参传递不像一维数组那么简单,请看以下详细分析。

异常代码:

int StrCut(char* pinput, char **ppOut)
{
	char *p = NULL;
	int count = 0;

	if (NULL == pinput)
	{
		return -1;
	}

	printf("input:%s\n", pinput);
	
	p = strtok(pinput, "/");
	
	printf("<%p>p:%s\n", p, p);
	strcpy(&(ppOut[count]), p);
	printf("<%p>ppOut[%d]:%s\n", &(ppOut[count]), count, &(ppOut[count]));
	count++;

	while((p = strtok(NULL, "/")))
	{
		printf("<%p>p:%s\n", p, p);
		strcpy(&(ppOut[count]), p);
		printf("<%p>ppOut[%d]:%s\n", &(ppOut[count]), count, &(ppOut[count]));
		count++;
	}
	
	return count;
}

int main()
{
	int i;
	int nCnt;
	char aaCutRtn[10][64];
	char *str = "123/abc/456/efg"
	
	for(i = 0; i < 10; i++)
	{
		memset(aaCutRtn[i], 0, sizeof(aaCutRtn[i]));

		printf("<%p>&aaCutRtn[%d] <%p>&aaCutRtn[%d][0] <%p>aaCutRtn[%d]\n", &aaCutRtn[i], i, &aaCutRtn[i][0], i, aaCutRtn[i], i);
	}

	nCnt = StrCut(str , aaCutRtn);
	printf("nCnt [%d]\n", nCnt );
				
	if (nCnt > 0)
	{
		for(i = 0; i < nCnt ; i++)
		{
			printf("<%p>aaCutRtn[%d]:%s\n", aaCutRtn[i], i, aaCutRtn[i]);
		}
	}
}

int StrCut(char* pinput, char **ppOut)

运行中加了打印信息,&aaTopic[0]是aaTopic[0]的地址,即第0行的首地址,aaTopic[0]本身是aaTopic[0][0]的地址,即&aaTopic[0][0],都是相等的。注意到函数的第二个参数是指针的指针,在函数内部对ppOut[count++]初始化时,实际上每次指针只偏移了4个字节,即一个指针的长度,所以返回的结果一定是错误的。通过网上查找资料发现,对于二维数组的传递,是要传递具体的列数,或者转换成一维数组指针后再传递,具体方法如下:

解决方法

  1. 形参给出第二维的长度
#include <stdio.h>
void func(int n, char  str[ ][5] )
{
	int i;
	for(i = 0; i < n; i++)
	printf("/nstr[%d] = %s/n", i, str[i]);
}

void main()
{
	char* p[3];
	char str[][5] = {"abc","def","ghi"};
	func(3, str);
}
  1. 形参声明为指向数组的指针
#include <stdio.h>
void func(int n, char*str)[5] )
{
	int i;
	for(i = 0; i < n; i++)
	printf("/nstr[%d] = %s/n", i, str[i]);
}

void main()
{
	char* p[3];
	char str[][5] = {"abc","def","ghi"};
	func(3, str);
}
  1. 形参声明为指针的指针
#include <stdio.h>
void func(int n, char **str)
{
	int i;
	for(i = 0; i < n; i++)
	printf("/nstr[%d] = %s/n", i, str[i]);
}
void main()
{
	char* p[3];
	char str[][5] = {"abc","def","ghi"};
	p[0] = str[0];
	p[1] = str[1];
	p[2] = str[2];
	func(3, p);

}

所以开头的代码只要修改参数为如下所示,运行结果正常。

int TopicCut(char* pinput, char (*ppOut)[64])

参考:

https://blog.csdn.net/kangxidagege/article/details/79475537

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言二维数组作为形参传递问题 的相关文章

  • flowable(五) - 使用flowable-admin-ui 流程部署到数据库

    前言 看完别人集成boot项目的demo 他的部署方式是通过和moderer项目里面的代码进行部署的 flowable流程资源部署方式 这里提到了Model方式部署 设计器中的发布就是用的此方法这里就是上篇作者的代码 所以说 设计器的发布

随机推荐

  • jupyter 写入csv pandas_pandas:如何简单3步绘制直方图

    大家好 这是近期学习的data analysis 那本书的总结 发表这些东西的主要目的就是督促自己 希望大家关注评论指出不足 一起进步 内容我都会写的很细 并且按照文章中的代码自己也可以做出一样的结果 一个目的就是零基础也能懂 因为自己就是
  • Tensorflow Serving部署tensorflow、keras模型详解

    写在篇前 本篇介绍如何使用Tensorflow Serving组件导出训练好的Tensorflow模型 并使用标准tensorflow model server来部署深度学习模型预测服务 tensorflow model server主要负
  • 信道建模那些事--仿真Matlab

    一 小尺度衰落 瑞利信道 莱斯信道 和大尺度衰落Matlab信道建模 一般论文中给出的是下面高亮的大尺度衰落模型 要把它换成单位是W的 dB换成W公式推导如下所示 公式中 P L 0 PL 0 PL
  • PLSQL编程详细

    目录 1 概念和目的 1 1 什么是PL SQL 1 2 程序结构 1 3 Hello World sqlplus编译运行 开启输出 set serveroutput on 1 4 变量 1 4 1 普通变量 1 4 2 引用型变量 引用型
  • RS485主从式多机通讯协议

    RS485主从式多机通讯协议一 数据传输协议 此协议定义了一个控制器能认识使用的消息结构 而不管它们是经过何种网络进行通信的 它描述了一控制器请求访问其它设备的过程 如何回应来自其它设备的请求 以及怎样侦测错误并记录 它制定了消息域格局和内
  • 车载LED 舞台灯 备用灯 智能过热调节降压恒流芯片NS4116

    车载LED是一种在汽车和其他交通工具中广泛使用的照明技术 车载LED具有许多优点 使其成为汽车照明系统的流行选择 关于车载LED的一些重要信息 高亮度和能效 车载LED灯具有高亮度 能够产生明亮 清晰的光线 同时具有较低的能耗 这使得它们比
  • 用ChatGPT编写测试大纲和测试用例

    问 当用户未支付时 不需要数据上报 当用户支付成功时 需要数据上报 请以这个逻辑帮我写测试用例 ChatGPT 好的 根据您提供的逻辑 我可以为您列出一些测试用例 1 确认在用户未支付时 不会产生数据上报 2 测试在用户支付成功后 数据是否
  • 公安交管工作数字化转型存在的问题及对策建议

    近年来 数字中国 交通强国 数字政府 等关键词密集出现在党和国家层面的各种会议 文件 报告和规划中 特别是在党的二十大报告中 明确提出加快建设 数字中国 和 交通强国 2023年初 又先后印发了 数字中国建设整体布局规划 和批准组建国家数据
  • ps 命令查看进程下的线程及线程状态

    ps 命令查看进程下的线程及线程状态 查看java所有线程 ps eLf grep java 查看进程下的所有线程cpu利用率 top H p 25120 其中25120为Java进程号 下图红色标注的地方为线程状态 其中总数为28 当前运
  • Windows 32位、64位 Android Studio 解压版安装及SDK配置

    android studio最新版只有64位可以直接安装 不用配置 32位只能解压后自己安装SDK并配置 android studio需要安装jdk才能运行 我的jdk已经配置好 可以通过在cmd中输入java version检查jdk是否
  • CH5-数据存储

    文章目录 目标 一 数据存储方式 目标 1 1 数据存储方式 二 文件存储 目标 2 1 将数据存入文件中 内部存储 外部存储 2 2 从文件中读取数据 内部存储 外部存储 申请SD卡写文件的权限 2 3 实战演练 保存QQ账号与密码 三
  • linux网络名字空间介绍

    1 什么是网络名字空间 what are network namespaces Generally speaking an installation of Linux shares a single set of network inter
  • sockjs-node请求一直报错

    今天在运行本地项目时候 一直提示sockjs node info 请求失败 我一直在想本地并没有这个请求接口 这个是哪里来的 后来经过查阅资料发现 sockjs node 是一个JavaScript库 提供跨浏览器 JavaScript 的
  • 蓝桥杯省赛2021 回路计数 python

    题目描述 蓝桥学院由 21栋教学楼组成 教学楼编号 1 到 21 对于两栋教学楼 a 和 b 当 a 和 b 互质时 a和 b之间有一条走廊直接相连 两个方向皆可通行 否则没有直接连接的走廊 小蓝现在在第一栋教学楼 他想要访问每栋教学楼正好
  • python实现onvif客户端及问题小结

    python实现onvif客户端及问题小结 文章目录 python实现onvif客户端及问题小结 1 前言 2 python onvif安装及ptz示例 2 1 openwrt下安装pip及python onvif 2 2 ptz示例 3
  • 公众号一次性订阅消息

    洛塔服务号回复007获取代码 功能说明 之前发布通知 要用订阅通知替代一次性订阅消息 不知道是被骂的太惨还是技术原因 一次性订阅消息还是一直能用 和模板消息不同的是 一次性订阅消息无需用户关注公众号 但是必须用户点击同意发送才能接收消息 模
  • 面试被问Spring Boot自动配置原理,答不出来?

    我们知道 Spring Boot 项目创建完成后 即使不进行任何的配置 也能够顺利地运行 这都要归功于 Spring Boot 的自动化配置 Spring Boot 默认使用 application properties 或 applica
  • 1.7 C++ struct class

    c 中 struct 内可以定义函数 c不可以 定义时 可以省略struct关键字 可以对成员加入访问权限 private protected public 如何对private和protected 进行外部赋值和访问 set 和get方法
  • selenium跳转新页面定位

    1 获取当前页面 跳转过来的页面 句柄 self driver window handles 1 2 切换窗口 self driver switch to window self driver window handles 1 3 sele
  • C语言二维数组作为形参传递问题

    问题 今天想用一个二维字符串数组保存字符串 在参数传递过程中发现返回的结果不对 上网一搜 发现二维数组作为形参传递不像一维数组那么简单 请看以下详细分析 异常代码 int StrCut char pinput char ppOut char