急!!!!!!!!!!!C++中关于strcat()函数占用其他变量内存地址的问题?

问题描述

急!!!!!!!!!!!C++中关于strcat()函数占用其他变量内存地址的问题?
源代码有点长,我就只贴关键部分了!

 int main(){   /省略部分代码。。。。/    LinearList *L=(LinearList *)malloc(sizeof(LinearList));    InitList(LMAX);    while(1){    printf(""Input file:"");    gets(filename);    //用get函数避免scanf以空格分割数据    if (filename[0]==34) filename[strlen(filename)-1]=0strcpy(filenamefilename+1);  //支持文件拖曳但会多出双引号这里是处理多余的双引号    if (!strcmp(filenameexit"")) exit(0);  //输入exit退出    if (!(fp=fopen(filenamerb""))) {printf(""Can not open this file!n"");continue;}  //以二进制打开文件    fseek(fp 0 SEEK_END);  //文件指针转到文件末尾    if((len=ftell(fp))==-1) {printf(""Sorry! Can not calculate files which larger than 2 GB!n"");fclose(fp);continue;}  //ftell函数返回long最大为2GB超出返回-1    rewind(fp);  //文件指针复位到文件头    A=0x67452301B=0xefcdab89C=0x98badcfeD=0x10325476; //初始化链接变量    flen[1]=len/0x20000000;     //flen单位是bit    flen[0]=(len%0x20000000)*8;    memset(x064);   //初始化x数组为0    fread(&x416fp);  //以4字节为一组读取16组数据    for(i=0;i<len/64;i++){    //循环运算直至文件结束      md5();      memset(x064);      fread(&x416fp);    }    ((char*)x)[len%64]=128;  //文件结束补1补0操作128二进制即10000000    if(len%64>55) md5()memset(x064);    memcpy(x+14flen8);    //文件末尾加入原文件的bit长度    md5();    fclose(fp);    char str1[8];    sprintf(str1%08x""PP(A));    char *s1=str1;    char str2[8];    sprintf(str2%08x""PP(B));    char *s2=str2;    char str3[8];    sprintf(str3%08x""PP(C));    char *s3=str3;    char str4[8];    sprintf(str4%08x""PP(D));    char *s4=str4;    strcat(str1str2);    strcat(str1str3);    strcat(str1str4);    cout<<str1<<endl;    char *p=str1;    node x(pfilename);    InsertElem(Lx);  }    Printout(L);    return 0;}

然后问题是这样的:
通过调试发现:我在while循环外面定义和初始化了变量L之后,L的相关成员变量都有了内存地址。结果当运行完strcat(str1str2)之后,奇怪的是L变量的内存地址突然变了,导致它所有的成员变量都没有有效内存地址。接下来,任何需要传入L作为参数的函数都没有办法运行,报错。
请问:这是怎么一回事啊???解决办法是????或者我通过其他方法把str1、str2、str3连接起来????

解决方案

你分配的内存不够,字符串需要的大小是长度+1,因为还有一个结束符也需要1个元素。

时间: 2024-08-02 09:20:45

急!!!!!!!!!!!C++中关于strcat()函数占用其他变量内存地址的问题?的相关文章

python中查看变量内存地址的方法

  这篇文章主要介绍了python中查看变量内存地址的方法,涉及Python中id使用技巧,需要的朋友可以参考下 本文实例讲述了python中查看变量内存地址的方法.分享给大家供大家参考.具体实现方法如下: 这里可以使用id ? 1 2 3 4 5 >>> print id.__doc__ id(object) -> integer Return the identity of an object. This is guaranteed to be unique among sim

C语言中字符串常用函数strcat与strcpy的用法介绍

以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下   strcpy原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include <string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针.函数实现: 复制代

opencv 中的inRange函数怎么用,求高人指点///,急求,大神给帮忙解决一下,谢谢

问题描述 opencv 中的inRange函数怎么用,求高人指点///,急求,大神给帮忙解决一下,谢谢 inRange函数的参数是什么意思,有没有详解??opencv 中的inRange函数怎么用,求高人指点///,急求,大神给帮忙解决一下,谢谢 解决方案 void cvInRangeS( const CvArr* src CvScalar lower CvScalar upper CvArr* dst );src 第一个原数组 lower 包括进的下边界. upper 不包括进的上边界 dst

在 SQL Server 2005 中使用表值函数来实现空间数据库

server|函数|数据|数据库 Gyorgy Fekete 和 Alex Szalay约翰霍普金丝大学 Jim GrayMicrosoft(联系作者) 适用于Microsoft SQL Server 2005 摘要:本文说明了如何使用 C# 和表值函数将空间搜索函数("邻近点的点"和"多边形内的点")添加到 Microsoft SQL Server 2005.使用此库可以在不编写任何特殊代码的情况下向应用程序中添加空间搜索.此库实现了来自约翰霍普金丝大学的公共域

C语言string.h中常用字符函数介绍

strcpy 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *strcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n",

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一)

Constructs a closure: an unnamed function object capable of capturing variables in scope. -- Lambda functions (since C++11) [cppreference.com] 按照C++11标准的说法,lambda表达式的标准格式如下: [ capture ] ( params ) mutable exception attribute -> ret { body } // (1) 完整

qt-Qt 怎么在自定义函数中调用MainWindow中的槽函数

问题描述 Qt 怎么在自定义函数中调用MainWindow中的槽函数 自定义的函数,没有继承MainWindow,写了emit 信号一直报错. 怎么在自定义函数中调用MainWindow中的槽函数. 解决方案 在线等.......急 解决方案二: 你自定义的信号已经和MainWindow中的槽函数connect了么

详解Javascript ES6中的箭头函数(Arrow Functions)_基础知识

ES6可以使用"箭头"(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 1. 具有一个参数的简单函数 var single = a => a single('hello, world') // 'hello, world' 2. 没有参数的需要用在箭头前加上小括号 var log = () => { alert('no param') } 3. 多个参数需要用到小括号,参数间逗号间隔,例如两个数字相加 var add = (a, b) =&g

深入解析C++编程中的静态成员函数_C 语言

C++静态成员函数 与数据成员类似,成员函数也可以定义为静态的,在类中声明函数的前面加static就成了静态成员函数.如 static int volume( ); 和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分. 如果要在类外调用公用的静态成员函数,要用类名和域运算符"::".如 Box::volume( ); 实际上也允许通过对象名调用静态成员函数,如 a.volume( ); 但这并不意味着此函数是属于对象a的,而只是用a的类型而已. 与静态数据成员不同,静态成