这段代码出现这种警告警告是什么意思

guizi1234 2013-06-05 03:40:16
编译环境:Visual Studio 2008
代码:

//练习代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>

unsigned char a1[] = "hello";

void main(void)
{
int i;
unsigned char *pa2;

pa2 = malloc(strlen(a1) * sizeof(unsigned char));
if(pa2 == NULL)
{
printf("Out Of Memory!");
}
else
{
strcpy(pa2,a1);
for(i=0;i<6;i++)
{
printf("%c",*pa2++);
}
free(pa2);
pa2 = NULL;
}
}

如果不加

free(pa2);
pa2 = NULL;

的话没问题 但是加上这两句代码后会提示:

请问这个是什么原因?
...全文
249 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hugett 2013-06-05
  • 打赏
  • 举报
回复
你改变了pa2的值。。它已经不是指向字符数组的开始。。所以你free也会出现错误。。
pbdwadr 2013-06-05
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
starytx 2013-06-05
  • 打赏
  • 举报
回复
引用 6 楼 guizi1234 的回复:
[quote=引用 4 楼 starytx 的回复:] 在打印循环中 *pa2++ 改变了pa2的最初指向,所以free失败
现在改了代码,加了一个指针作为中介,还是出现问题:

//练习代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>

void main(void)
{	
	int i;
	unsigned char a1[] = "hello";
	unsigned char *pa2 = NULL;
	unsigned char *p = NULL;

	pa2 = malloc(strlen(a1) * sizeof(unsigned char));
	if(pa2 == NULL)
	{
		printf("Out Of Memory!");
	}
	else
	{
		strcpy(pa2,a1);
		p = pa2;
		for(i=0;i<6;i++)
		{
			printf("%c",*p++);
		}
		free(pa2);
	}
}
输出的错误信息: [/quote]数组越界访问了,malloc了5个字节,因为strlen只是计算了有效字符的个数,而不是数组的实际大小(不包括结束符),所以for循环数组越界访问了
庄鱼 2013-06-05
  • 打赏
  • 举报
回复
for(i=0;i<6;i++) //-------- ps2有效长度为5而不是6 for((i=0;*pa2;i++) { printf("%c",*pa2++); } for(i=0;pa2[i];++i) printf("%c",pa2[i]); for(p=pa2;*p;) printf("%c",*p++);
测试NULL 2013-06-05
  • 打赏
  • 举报
回复
这个涉及到内存分配,strlen和sizeof的区别等等,你不如加我Q详聊下

//练习代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
void main(void)
{    
    int i;
    unsigned char a1[] = "hello";
    unsigned char *pa2 = NULL;
    unsigned char *p = NULL;

    pa2 = (unsigned char*)malloc(sizeof(a1) * sizeof(unsigned char));    //注意看这里,如果使用strlen(a1),则会少分配一个字节
    if(pa2 == NULL)
    {
        printf("Out Of Memory!");
    }
    else
    {
        strcpy((char*)pa2,(const char*)a1);
	p = pa2;

        for(i=0; i<sizeof(a1)-1; i++)
        {
            printf("%c",*p++);
        }
	printf("\n");

        free(pa2);
	pa2 = NULL;
    }
}
guizi1234 2013-06-05
  • 打赏
  • 举报
回复
引用 4 楼 starytx 的回复:
在打印循环中 *pa2++ 改变了pa2的最初指向,所以free失败

现在改了代码,加了一个指针作为中介,还是出现问题:

//练习代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>

void main(void)
{
int i;
unsigned char a1[] = "hello";
unsigned char *pa2 = NULL;
unsigned char *p = NULL;

pa2 = malloc(strlen(a1) * sizeof(unsigned char));
if(pa2 == NULL)
{
printf("Out Of Memory!");
}
else
{
strcpy(pa2,a1);
p = pa2;
for(i=0;i<6;i++)
{
printf("%c",*p++);
}
free(pa2);
}
}

输出的错误信息:
guizi1234 2013-06-05
  • 打赏
  • 举报
回复
引用 2 楼 wangliangffaflgh 的回复:
解释请看注释,有疑问加我Q 995003822

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

int main(int argc, char *argv[])
{
int i;
char *pa2 = NULL;
const char a1[] = "hello";
char *tempPtr = NULL;

size_t strSize = strlen(a1)+1;
pa2 = (char *)malloc(strSize * sizeof(char));
memset(pa2, 0x00, strSize);

if(pa2 == NULL)
{
printf("Out Of Memory!");
}
else
{
strcpy(pa2, a1);
tempPtr = pa2; //关键是这边,如果不使用用一个tempPtr,而直接使用pa2的话,看下面:
for(i=0;i < strlen(pa2);i++)
{
printf("%c",*tempPtr++); //这边pa2++就改变了pa2这个指针,下面调用free必须使用p2指针最初的地址值。
}

free(pa2);
pa2 = NULL;
}

return 0;
}

感谢您的用心回复
//练习代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>

void main(void)
{
int i;
unsigned char a1[] = "hello";
unsigned char *pa2 = NULL;
unsigned char *p = NULL;

pa2 = malloc(strlen(a1) * sizeof(unsigned char));
if(pa2 == NULL)
{
printf("Out Of Memory!");
}
else
{
strcpy(pa2,a1);
p = pa2;
for(i=0;i<6;i++)
{
printf("%c",*p++);
}
free(pa2);
}
}

输出的错误信息:
[img=https://img-bbs.csdn.net/upload/201306/05/1370421053_18049.png" alt="" />
starytx 2013-06-05
  • 打赏
  • 举报
回复
在打印循环中 *pa2++ 改变了pa2的最初指向,所以free失败
十八道胡同 2013-06-05
  • 打赏
  • 举报
回复
为啥要%c的输出,你%s输出pa2就可以的
测试NULL 2013-06-05
  • 打赏
  • 举报
回复
解释请看注释,有疑问加我Q 995003822

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

int main(int argc, char *argv[])
{
    int i;
    char *pa2 = NULL;
    const char a1[] = "hello";
    char *tempPtr = NULL;
    
    size_t strSize = strlen(a1)+1;
    pa2 = (char *)malloc(strSize * sizeof(char));
    memset(pa2, 0x00, strSize);
    
    if(pa2 == NULL)
    {
        printf("Out Of Memory!");
    }
    else
    {
        strcpy(pa2, a1);
        tempPtr = pa2;   //关键是这边,如果不使用用一个tempPtr,而直接使用pa2的话,看下面:
        for(i=0;i < strlen(pa2);i++)
        {
            printf("%c",*tempPtr++);  //这边pa2++就改变了pa2这个指针,下面调用free必须使用p2指针最初的地址值。
        }
        
        free(pa2);
        pa2 = NULL;
    }
    
    return 0;
}
测试NULL 2013-06-05
  • 打赏
  • 举报
回复
先贴上正确的写法:

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

int main(int argc, char *argv[])
{
    int i;
    unsigned char *pa2 = NULL;
    const unsigned char a1[] = "hello";
    unsigned char *tempPtr = NULL;
    
    size_t strSize = (strlen((const char *)a1)+1);
    pa2 = (unsigned char *)malloc(strSize * sizeof(unsigned char));
    memset(pa2, 0x00, strSize);
    
    if(pa2 == NULL)
    {
        printf("Out Of Memory!");
    }
    else
    {
        strcpy((char *)pa2, (const char *)a1);
        tempPtr = pa2;
        for(i=0;i < strlen((char *)pa2);i++)
        {
            printf("%c",*tempPtr++);
        }
        
        free(pa2);
        pa2 = NULL;
    }
    
    return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧