free一直报错。。。求助

u010554015 2013-05-04 09:49:16
第1,2次循环都不报错,第三次跑到free(p)就:

Windows 已在 test.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 简易评分系统(服务器端).exe 中或它所加载的任何 DLL 中有 Bug。


if(flag){
char *n=(char*)malloc(sizeof(char));
*n='\0';
int num=0;
char *p;
for(l=0;l<strlen(argv[i]);l++){
if((argv[i][l]>='a'&&argv[i][l]<='z')||(argv[i][l]>='A'&&argv[i][l]<='Z')){
num++;
p=n;
n=(char*)malloc(sizeof(char)*(num+1));
if(num>1){
strcpy(n,p);
}
free(p);
n[num-1]=argv[i][l];
}
}
free(ar[i-1]);
ar[i-1]=n;
}
...全文
267 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2013-05-04
  • 打赏
  • 举报
回复
strncpy或者记得n[num]='\0',不然会出事故,譬如你第三次申请空间位置恰好在上次之前,strcpy越界破坏上次空间数据,free不掉了...
u010554015 2013-05-04
  • 打赏
  • 举报
回复
引用 15 楼 xuchao1229 的回复:
free(p)干什么??? 你这里只是用p指向了n
p=n;
                        n=(char*)malloc(sizeof(char)*(num+1));
                        if(num>1){
                            strcpy(n,p);
                        }
                        free(p);
应该是free(n)吧
我是用p来指向n,然后给n申请新的地址,如果p不指向n的话,n原来的地址就丢了,然后我用p把n原来的地址free了,我是那么想的
14号选手 2013-05-04
  • 打赏
  • 举报
回复
free(p)干什么??? 你这里只是用p指向了n
p=n;
                        n=(char*)malloc(sizeof(char)*(num+1));
                        if(num>1){
                            strcpy(n,p);
                        }
                        free(p);
应该是free(n)吧
u010554015 2013-05-04
  • 打赏
  • 举报
回复
引用 13 楼 xuchao1229 的回复:
[quote=引用 10 楼 u010554015 的回复:] [quote=引用 9 楼 xuchao1229 的回复:] ar[i-1]是啥玩意??? 前面的定义呢??? 什么都不给出,怎么看得出来啊

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

#define NB_OF_ARGS 10

int main(int argc, char **argv) {
	int i,j,l;
    if (argc != NB_OF_ARGS + 1) {
        printf("Run the program with 10 command line arguments please.\n");
        return EXIT_FAILURE;
    }
    /* REPLACE WITH COMMENT WITH YOUR CODE */
    
    char *ar[NB_OF_ARGS];
    
    for(i=1;i<=NB_OF_ARGS;i++){
    	ar[i-1]=(char*)malloc(sizeof(char)*32);
    	strcpy(ar[i - 1], argv[i]);
    	int flag=1;
    	for(j=0;j<strlen(argv[i]);j++){
            if(ar[i-1][j]>='0'&& ar[i-1][j]<='9'){
                int k=ar[i-1][j]=='0'?10:ar[i-1][j]-'0';
                char *n=(char*)malloc(sizeof(char));
                *n='\0';
                int num=0;
                char *p;
                for(l=0;l<strlen(argv[k]);l++){
                    if((argv[k][l]>='a'&&argv[k][l]<='z')||(argv[k][l]>='A'&&argv[k][l]<='Z')){
                        num++;
                        p=n;
                        n=(char*)malloc(sizeof(char)*(num+1));
                        if(num>1){
                            strcpy(n,p);
                        }
                        free(p);
                        n[num-1]=argv[k][l];
                    }
                }
                n[num]='\0';
                free(ar[i-1]);
                ar[i-1]=n;

                flag=0;
                break;
            }
        }
	    if(flag){
	    	char *n=(char*)malloc(sizeof(char));
	    	*n='\0';
	    	int num=0;
			char *p;
    		for(l=0;l<strlen(argv[i]);l++){
				if((argv[i][l]>='a'&&argv[i][l]<='z')||(argv[i][l]>='A'&&argv[i][l]<='Z')){
					num++;
					p=n;
					n=(char*)malloc(sizeof(char)*(num+1));
					if(num>1){
						strcpy(n,p);
					}
					free(p);
					n[num-1]=argv[i][l];
				}
			}
            n[num]='\0';
			free(ar[i-1]);
			ar[i-1]=n;
    	}
    }
    
    for(i=1;i<=NB_OF_ARGS;++i){
    	argv[i]=ar[i-1];
    }
 	
    for (i = 1; i <= NB_OF_ARGS; ++i){
        printf("  %s", argv[i]);
    }
    putchar('\n');
    
    return EXIT_SUCCESS;
}
[/quote] vc编译也没有出错啊,把你报错的信息贴出来看看[/quote] Windows 已在 HW1.exe 中触发一个断点。 其原因可能是堆被损坏,这说明 HW1.exe 中或它所加载的任何 DLL 中有 Bug。 原因也可能是用户在 HW1.exe 具有焦点时按下了 F12。 输出窗口可能提供了更多诊断信息。 就是在free(p)的时候报的错。我刚刚在linux+gcc上也试了,也没错。但是free c跟VS2010就是会报错
14号选手 2013-05-04
  • 打赏
  • 举报
回复
引用 10 楼 u010554015 的回复:
[quote=引用 9 楼 xuchao1229 的回复:] ar[i-1]是啥玩意??? 前面的定义呢??? 什么都不给出,怎么看得出来啊

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

#define NB_OF_ARGS 10

int main(int argc, char **argv) {
	int i,j,l;
    if (argc != NB_OF_ARGS + 1) {
        printf("Run the program with 10 command line arguments please.\n");
        return EXIT_FAILURE;
    }
    /* REPLACE WITH COMMENT WITH YOUR CODE */
    
    char *ar[NB_OF_ARGS];
    
    for(i=1;i<=NB_OF_ARGS;i++){
    	ar[i-1]=(char*)malloc(sizeof(char)*32);
    	strcpy(ar[i - 1], argv[i]);
    	int flag=1;
    	for(j=0;j<strlen(argv[i]);j++){
            if(ar[i-1][j]>='0'&& ar[i-1][j]<='9'){
                int k=ar[i-1][j]=='0'?10:ar[i-1][j]-'0';
                char *n=(char*)malloc(sizeof(char));
                *n='\0';
                int num=0;
                char *p;
                for(l=0;l<strlen(argv[k]);l++){
                    if((argv[k][l]>='a'&&argv[k][l]<='z')||(argv[k][l]>='A'&&argv[k][l]<='Z')){
                        num++;
                        p=n;
                        n=(char*)malloc(sizeof(char)*(num+1));
                        if(num>1){
                            strcpy(n,p);
                        }
                        free(p);
                        n[num-1]=argv[k][l];
                    }
                }
                n[num]='\0';
                free(ar[i-1]);
                ar[i-1]=n;

                flag=0;
                break;
            }
        }
	    if(flag){
	    	char *n=(char*)malloc(sizeof(char));
	    	*n='\0';
	    	int num=0;
			char *p;
    		for(l=0;l<strlen(argv[i]);l++){
				if((argv[i][l]>='a'&&argv[i][l]<='z')||(argv[i][l]>='A'&&argv[i][l]<='Z')){
					num++;
					p=n;
					n=(char*)malloc(sizeof(char)*(num+1));
					if(num>1){
						strcpy(n,p);
					}
					free(p);
					n[num-1]=argv[i][l];
				}
			}
            n[num]='\0';
			free(ar[i-1]);
			ar[i-1]=n;
    	}
    }
    
    for(i=1;i<=NB_OF_ARGS;++i){
    	argv[i]=ar[i-1];
    }
 	
    for (i = 1; i <= NB_OF_ARGS; ++i){
        printf("  %s", argv[i]);
    }
    putchar('\n');
    
    return EXIT_SUCCESS;
}
[/quote] vc编译也没有出错啊,把你报错的信息贴出来看看
u010554015 2013-05-04
  • 打赏
  • 举报
回复
引用 11 楼 xiaoji0507 的回复:
linux + gcc 没有问题。打印的是输入的十个字符串
free 不报错?我用free c和VS2010全都报这个错
xiaoji0507 2013-05-04
  • 打赏
  • 举报
回复
linux + gcc 没有问题。打印的是输入的十个字符串
u010554015 2013-05-04
  • 打赏
  • 举报
回复
引用 9 楼 xuchao1229 的回复:
ar[i-1]是啥玩意??? 前面的定义呢??? 什么都不给出,怎么看得出来啊

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

#define NB_OF_ARGS 10

int main(int argc, char **argv) {
	int i,j,l;
    if (argc != NB_OF_ARGS + 1) {
        printf("Run the program with 10 command line arguments please.\n");
        return EXIT_FAILURE;
    }
    /* REPLACE WITH COMMENT WITH YOUR CODE */
    
    char *ar[NB_OF_ARGS];
    
    for(i=1;i<=NB_OF_ARGS;i++){
    	ar[i-1]=(char*)malloc(sizeof(char)*32);
    	strcpy(ar[i - 1], argv[i]);
    	int flag=1;
    	for(j=0;j<strlen(argv[i]);j++){
            if(ar[i-1][j]>='0'&& ar[i-1][j]<='9'){
                int k=ar[i-1][j]=='0'?10:ar[i-1][j]-'0';
                char *n=(char*)malloc(sizeof(char));
                *n='\0';
                int num=0;
                char *p;
                for(l=0;l<strlen(argv[k]);l++){
                    if((argv[k][l]>='a'&&argv[k][l]<='z')||(argv[k][l]>='A'&&argv[k][l]<='Z')){
                        num++;
                        p=n;
                        n=(char*)malloc(sizeof(char)*(num+1));
                        if(num>1){
                            strcpy(n,p);
                        }
                        free(p);
                        n[num-1]=argv[k][l];
                    }
                }
                n[num]='\0';
                free(ar[i-1]);
                ar[i-1]=n;

                flag=0;
                break;
            }
        }
	    if(flag){
	    	char *n=(char*)malloc(sizeof(char));
	    	*n='\0';
	    	int num=0;
			char *p;
    		for(l=0;l<strlen(argv[i]);l++){
				if((argv[i][l]>='a'&&argv[i][l]<='z')||(argv[i][l]>='A'&&argv[i][l]<='Z')){
					num++;
					p=n;
					n=(char*)malloc(sizeof(char)*(num+1));
					if(num>1){
						strcpy(n,p);
					}
					free(p);
					n[num-1]=argv[i][l];
				}
			}
            n[num]='\0';
			free(ar[i-1]);
			ar[i-1]=n;
    	}
    }
    
    for(i=1;i<=NB_OF_ARGS;++i){
    	argv[i]=ar[i-1];
    }
 	
    for (i = 1; i <= NB_OF_ARGS; ++i){
        printf("  %s", argv[i]);
    }
    putchar('\n');
    
    return EXIT_SUCCESS;
}
14号选手 2013-05-04
  • 打赏
  • 举报
回复
ar[i-1]是啥玩意??? 前面的定义呢??? 什么都不给出,怎么看得出来啊
xiaoji0507 2013-05-04
  • 打赏
  • 举报
回复
1、在你贴出的程序中出了free那个地方外没有找到ar[] 2、free出错无非就两种原因。 1)字符串不是malloc出来的 2) free的字符串和malloc出来的地址不同 自己好好查吧
u010554015 2013-05-04
  • 打赏
  • 举报
回复
引用 6 楼 xiaoji0507 的回复:
[quote=引用 4 楼 u010554015 的回复:] [quote=引用 2 楼 xiaoji0507 的回复:] ar[i-1] 是个神马东东? 还有free的时候如果和malloc的地址不同会出错的
argv里是10个字符串,我free的和malloc的是同一个地址吧?

int main(int argc, char **argv) 
[/quote] argv里面的字符串是程序启动的时候传进去的吧。这个能free么?[/quote] 我没有free argv啊,我free的是ar和n,两个都是我malloc出来的,而且是在free p的时候出的错,p的地址=n啊
xiaoji0507 2013-05-04
  • 打赏
  • 举报
回复
引用 4 楼 u010554015 的回复:
[quote=引用 2 楼 xiaoji0507 的回复:] ar[i-1] 是个神马东东? 还有free的时候如果和malloc的地址不同会出错的
argv里是10个字符串,我free的和malloc的是同一个地址吧?

int main(int argc, char **argv) 
[/quote] argv里面的字符串是程序启动的时候传进去的吧。这个能free么?
u010554015 2013-05-04
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
写的乱七八糟的。看不懂在干啥,你的i怎么定义的?在哪里变化的
i啥的不用管,这段是从一个循环里截出来的。你看成1就行了。argv是个字符串数组指针,这里的argv[i]="weired",然后我定义了一个字符指针*n,把argv[i]中不是字母的字符全都过滤掉。我一个字符一个字符的做判定,如果是的话就重新为n申请一个地址,空间=原来n的空间+1,然后用p来free n原来的地址。最后完成以后ar[i-1]原来的空间free掉,再把n 给ar[i-1]。
u010554015 2013-05-04
  • 打赏
  • 举报
回复
引用 2 楼 xiaoji0507 的回复:
ar[i-1] 是个神马东东? 还有free的时候如果和malloc的地址不同会出错的
argv里是10个字符串,我free的和malloc的是同一个地址吧?

int main(int argc, char **argv) 
starytx 2013-05-04
  • 打赏
  • 举报
回复
写的乱七八糟的。看不懂在干啥,你的i怎么定义的?在哪里变化的
xiaoji0507 2013-05-04
  • 打赏
  • 举报
回复
ar[i-1] 是个神马东东? 还有free的时候如果和malloc的地址不同会出错的
u010554015 2013-05-04
  • 打赏
  • 举报
回复
各位大哥给看看这是啥情况。。
14号选手 2013-05-04
  • 打赏
  • 举报
回复
引用 17 楼 angel_su 的回复:
strncpy或者记得n[num]='\0',不然会出事故,譬如你第三次申请空间位置恰好在上次之前,strcpy越界破坏上次空间数据,free不掉了...
lz貌似没有用strncpy这个函数吧,strcpy是自动在末尾添加结束符吧

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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