c/c++ error:在GetAdaptersInfo循环中使用strcat时,忘记清空strcat导致 内存溢出 异常

1、感觉程序没啥  问题  ,结果一运行,一大堆问题,都出来了。错误代码如下:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <IPHlpApi.h>
#include <string.h>

#pragma comment(lib,"IPHlpApi.lib")

int main()
{
	DWORD dwReturn = 1; 
	DWORD dwResult = 1;
	ULONG ulOutLen = sizeof( IP_ADAPTER_INFO );    //容易忘
	IP_ADAPTER_INFO *pIpAdapterInfo = ( IP_ADAPTER_INFO * )malloc( sizeof(IP_ADAPTER_INFO) );
	if ( pIpAdapterInfo == NULL )
	{
		printf("GetMac.cpp main IP_ADAPTER_INFO first malloc failed!");
		dwReturn = 1;
		goto exit;
	}

	dwResult = GetAdaptersInfo( pIpAdapterInfo, &ulOutLen );

	if ( dwResult == ERROR_BUFFER_OVERFLOW )
	{
		printf("GetMac.cpp main GetAdaptersInfo first param IP_ADAPTER_INFO  is too small,need to add space!");
		free(pIpAdapterInfo);
		pIpAdapterInfo = ( IP_ADAPTER_INFO * ) malloc( ulOutLen );
		if ( pIpAdapterInfo == NULL )
		{
			printf("GetMac.cpp main IP_ADAPTER_INFO second malloc failed!");
			dwReturn = 1;
			goto exit;
		}
		dwResult = GetAdaptersInfo( pIpAdapterInfo, &ulOutLen );
	}
	
	if ( dwResult != ERROR_SUCCESS )
	{	
		printf("GetMac.cpp main GetAdaptersInfo failed,Error:%lu", dwResult );
		dwReturn = 2;
		goto exit;
	}
	IP_ADAPTER_INFO *pAdapter = pIpAdapterInfo;
	char szMac[20];
	char szMacTempory[10];
	memset( szMac, 0, 20 );
	memset( szMacTempory, 0, 10 );
	while ( pAdapter )
	{
		printf("\n\tAdapter desc:%s\t\n",pAdapter->Description);
		printf("\n\tAdapter AddressLength:%d\t\n",pAdapter->AddressLength);
		
		for ( UINT dwIndex = 0; dwIndex < pAdapter->AddressLength; dwIndex++ )
		{
			if ( dwIndex < (pAdapter->AddressLength - 1) )
			{
				sprintf( szMacTempory, "%02X:", pAdapter->Address[dwIndex] );
				strcat( szMac, szMacTempory );
				
				//printf("%02X:", pAdapter->Address[dwIndex]);
				
			} 
			else if( dwIndex == (pAdapter->AddressLength - 1) )
			{
				
				sprintf( szMacTempory, "%02X", pAdapter->Address[dwIndex] );
				strcat( szMac, szMacTempory );
				// printf("%02X", pAdapter->Address[dwIndex]);
			}
			printf("%lu  ",dwIndex);
		}
		printf("szMac: %s",szMac);
		pAdapter = pAdapter->Next;
	}
	dwReturn = 0;
	goto exit;


exit:
	if (pIpAdapterInfo)
	{
		free(pIpAdapterInfo);
	}
	return dwReturn;
}

2、程序只能完整地列出一个网卡,当列出第二个网卡的时候,就会出现 ,getmac.exe程序异常停止的情况。可以看出是在列出网卡的mac地址时出问题了。


3、我在for循环中的大部分地方都加了log(for ( UINT dwIndex = 0; dwIndex < pAdapter->AddressLength; dwIndex++ )循环体中),但是都是只执行到第二个网卡的前五位mac地址,执行到第六位mac地址时就会出错,很准时的bug,而且每次都在那个地方出现。于是,为了方便简单地排除故障,我把for中的第一个if中的

				sprintf( szMacTempory, "%02X:", pAdapter->Address[dwIndex] );
				strcat( szMac, szMacTempory );
这条语句换成了我熟悉的
printf("%02X:", pAdapter->Address[dwIndex]);
把for中的第一个else if中的
				sprintf( szMacTempory, "%02X", pAdapter->Address[dwIndex] );
				strcat( szMac, szMacTempory );
换成了我熟悉的
printf("%02X", pAdapter->Address[dwIndex]);
结果就不会弹出bug。大致把错误定位在了sprintf和strcat中。


4、sprintf用的是一个临时变量,应该不会产生什么问题。strcat保存的是一个大的变量,的确有可能出问题。后来还真发现,是strcat出问题了。我一直在连接字符串,却没有清空字符串,因此会出错。


5、我的解决方案是:在while中for循环之前使用以下语句,来清空刚刚用strcat连接的上一个网卡的mac地址信息。

memset( szMac, 0, 20 );  //使用strcat最容易忘记 清空数组。

6、可见,在用c/c++对  字符串 进行操作时一定要有足够的 细心,不然很容易出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值