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;
}
18 个解决方案
#1
各位大哥给看看这是啥情况。。
#2
ar[i-1] 是个神马东东?
还有free的时候如果和malloc的地址不同会出错的
还有free的时候如果和malloc的地址不同会出错的
#3
写的乱七八糟的。看不懂在干啥,你的i怎么定义的?在哪里变化的
#4
argv里是10个字符串,我free的和malloc的是同一个地址吧?
int main(int argc, char **argv)
#5
i啥的不用管,这段是从一个循环里截出来的。你看成1就行了。argv是个字符串数组指针,这里的argv[i]="weired",然后我定义了一个字符指针*n,把argv[i]中不是字母的字符全都过滤掉。我一个字符一个字符的做判定,如果是的话就重新为n申请一个地址,空间=原来n的空间+1,然后用p来free n原来的地址。最后完成以后ar[i-1]原来的空间free掉,再把n 给ar[i-1]。
#6
argv里面的字符串是程序启动的时候传进去的吧。这个能free么?
#7
ar[i-1] 是个神马东东?
还有free的时候如果和malloc的地址不同会出错的
argv里是10个字符串,我free的和malloc的是同一个地址吧?
int main(int argc, char **argv)
argv里面的字符串是程序启动的时候传进去的吧。这个能free么?
我没有free argv啊,我free的是ar和n,两个都是我malloc出来的,而且是在free p的时候出的错,p的地址=n啊
#8
1、在你贴出的程序中出了free那个地方外没有找到ar[]
2、free出错无非就两种原因。
1)字符串不是malloc出来的
2) free的字符串和malloc出来的地址不同
自己好好查吧
2、free出错无非就两种原因。
1)字符串不是malloc出来的
2) free的字符串和malloc出来的地址不同
自己好好查吧
#9
ar[i-1]是啥玩意???
前面的定义呢???
什么都不给出,怎么看得出来啊
前面的定义呢???
什么都不给出,怎么看得出来啊
#10
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;
}
#11
linux + gcc 没有问题。打印的是输入的十个字符串
#12
linux + gcc 没有问题。打印的是输入的十个字符串
free 不报错?我用free c和VS2010全都报这个错
#13
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;
}
vc编译也没有出错啊,把你报错的信息贴出来看看
#14
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;
}
vc编译也没有出错啊,把你报错的信息贴出来看看
Windows 已在 HW1.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 HW1.exe 中或它所加载的任何 DLL 中有 Bug。
原因也可能是用户在 HW1.exe 具有焦点时按下了 F12。
输出窗口可能提供了更多诊断信息。
就是在free(p)的时候报的错。我刚刚在linux+gcc上也试了,也没错。但是free c跟VS2010就是会报错
#15
free(p)干什么???
你这里只是用p指向了n
应该是free(n)吧
你这里只是用p指向了n
p=n;
n=(char*)malloc(sizeof(char)*(num+1));
if(num>1){
strcpy(n,p);
}
free(p);
应该是free(n)吧
#16
free(p)干什么???
你这里只是用p指向了np=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了,我是那么想的
#17
strncpy或者记得n[num]='\0',不然会出事故,譬如你第三次申请空间位置恰好在上次之前,strcpy越界破坏上次空间数据,free不掉了...
#18
strncpy或者记得n[num]='\0',不然会出事故,譬如你第三次申请空间位置恰好在上次之前,strcpy越界破坏上次空间数据,free不掉了...
lz貌似没有用strncpy这个函数吧,strcpy是自动在末尾添加结束符吧
#1
各位大哥给看看这是啥情况。。
#2
ar[i-1] 是个神马东东?
还有free的时候如果和malloc的地址不同会出错的
还有free的时候如果和malloc的地址不同会出错的
#3
写的乱七八糟的。看不懂在干啥,你的i怎么定义的?在哪里变化的
#4
ar[i-1] 是个神马东东?
还有free的时候如果和malloc的地址不同会出错的
argv里是10个字符串,我free的和malloc的是同一个地址吧?
int main(int argc, char **argv)
#5
写的乱七八糟的。看不懂在干啥,你的i怎么定义的?在哪里变化的
i啥的不用管,这段是从一个循环里截出来的。你看成1就行了。argv是个字符串数组指针,这里的argv[i]="weired",然后我定义了一个字符指针*n,把argv[i]中不是字母的字符全都过滤掉。我一个字符一个字符的做判定,如果是的话就重新为n申请一个地址,空间=原来n的空间+1,然后用p来free n原来的地址。最后完成以后ar[i-1]原来的空间free掉,再把n 给ar[i-1]。
#6
ar[i-1] 是个神马东东?
还有free的时候如果和malloc的地址不同会出错的
argv里是10个字符串,我free的和malloc的是同一个地址吧?
int main(int argc, char **argv)
argv里面的字符串是程序启动的时候传进去的吧。这个能free么?
#7
ar[i-1] 是个神马东东?
还有free的时候如果和malloc的地址不同会出错的
argv里是10个字符串,我free的和malloc的是同一个地址吧?
int main(int argc, char **argv)
argv里面的字符串是程序启动的时候传进去的吧。这个能free么?
我没有free argv啊,我free的是ar和n,两个都是我malloc出来的,而且是在free p的时候出的错,p的地址=n啊
#8
1、在你贴出的程序中出了free那个地方外没有找到ar[]
2、free出错无非就两种原因。
1)字符串不是malloc出来的
2) free的字符串和malloc出来的地址不同
自己好好查吧
2、free出错无非就两种原因。
1)字符串不是malloc出来的
2) free的字符串和malloc出来的地址不同
自己好好查吧
#9
ar[i-1]是啥玩意???
前面的定义呢???
什么都不给出,怎么看得出来啊
前面的定义呢???
什么都不给出,怎么看得出来啊
#10
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;
}
#11
linux + gcc 没有问题。打印的是输入的十个字符串
#12
linux + gcc 没有问题。打印的是输入的十个字符串
free 不报错?我用free c和VS2010全都报这个错
#13
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;
}
vc编译也没有出错啊,把你报错的信息贴出来看看
#14
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;
}
vc编译也没有出错啊,把你报错的信息贴出来看看
Windows 已在 HW1.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 HW1.exe 中或它所加载的任何 DLL 中有 Bug。
原因也可能是用户在 HW1.exe 具有焦点时按下了 F12。
输出窗口可能提供了更多诊断信息。
就是在free(p)的时候报的错。我刚刚在linux+gcc上也试了,也没错。但是free c跟VS2010就是会报错
#15
free(p)干什么???
你这里只是用p指向了n
应该是free(n)吧
你这里只是用p指向了n
p=n;
n=(char*)malloc(sizeof(char)*(num+1));
if(num>1){
strcpy(n,p);
}
free(p);
应该是free(n)吧
#16
free(p)干什么???
你这里只是用p指向了np=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了,我是那么想的
#17
strncpy或者记得n[num]='\0',不然会出事故,譬如你第三次申请空间位置恰好在上次之前,strcpy越界破坏上次空间数据,free不掉了...
#18
strncpy或者记得n[num]='\0',不然会出事故,譬如你第三次申请空间位置恰好在上次之前,strcpy越界破坏上次空间数据,free不掉了...
lz貌似没有用strncpy这个函数吧,strcpy是自动在末尾添加结束符吧