当我从类实例调用方法时,我的C程序崩溃了

时间:2015-07-22 15:36:18

标签: c++ crash

这是我正在使用的课程。

#include<stdio.h>
#include <string.h>
class EnDe{

    private:
        int *k;
        char *temp;

    public:

        char * EncryptString(char *str);                         
        char * DecryptString(char *str);       
         EnDe(int *key);};
 EnDe::EnDe(int *key){

    k=key;
}

char * EnDe::EncryptString(char *str){

    int t=2;
    t=(int)k[1]*(int)2;
    for (int i=0;i<strlen(str);i++){
        temp[i]=str[i]+k[0]-k[2]+2-k[1]+k[3]+t;     


    }
    char alp=k[0]*57;
    for (int y=strlen(str);y<strlen(str)+9;y++){    //--*
        temp[y]=alp+y;                  //--*
    }
    temp[(strlen(str)+9)]='\0';     //--*
    return temp;

}

char * EnDe::DecryptString(char *str){

    int t=2;
    t=k[1]*2;

    for (int i=0;i<strlen(str);i++){

        temp[i]=str[i]-t-k[3]+k[1]-2+k[2]-k[0];  

    }

        temp[(strlen(str)-9)]='\0';
    return temp;

}

这是主程序。

#include <stdio.h>
#include "EnDe.h"

int main(void){

    char *enc;

    char op;

    printf("\nE to encrypt and D to decrypt");

    int opi[4]={1,2,9,1};   

    EnDe en(opi);

    strcpy(enc,en.EncryptString("It is C's Lounge!! "));

    printf("Encrypted :  %s",enc);

    return 0;
}

en.EncryptString函数

有问题

当我运行该程序时,它停止工作,给出错误并删除strcpy(enc,en.EncryptString(&#34;它是C&#39;休息室!!&#34;));它运行。我希望解决这个问题。

2 个答案:

答案 0 :(得分:1)

 char *enc;
    strcpy(enc,en.EncryptString("It is C's Lounge!! "));

你没有为副本提供任何空间 - enc并不指向任何地方。

答案 1 :(得分:0)

你永远不会分配任何记忆。

当你说

char *foo;

您告诉编译器您要将内存地址存储到某处的某些数据,但您还要存储某些数据。您的类存储两个指针(int *kchar *temp),它们永远不会分配任何内存,您的主要函数char *enc也是如此。这永远不会奏效。

在C和C ++中,有两种内存分配模式:一种是基于堆栈的分配,您可以在函数中声明变量名称,编译器或运行时将自动分配和释放为你记忆;另一个是基于堆的分配,您可以在运行时使用mallocnew分配内存,并且必须手动再次释放该内存使用deletefree

指针是&#34;只是&#34;堆栈分配的变量,包含另一个内存位置的地址。如果您没有为指针分配任何值,则它指向无效的内存,并且无论您尝试如何处理它都将失败。要修复程序,必须确保每个指针指向有效内存。如果您希望它指向基于堆栈的变量,请使用address-of运算符:

int val = 4;
int *pointer_to_val = &val;
/* the pointer_to_val variable now holds the address of the val variable */

如果您不希望它指向堆栈分配的变量,您必须自己分配内存。

在C ++中,堆内存使用new运算符分配,如下所示:

ClassType *instance = new ClassType(arg1, arg2)

其中ClassType是您要创建实例的类的类型,instance是您要存储刚刚创建的实例的地址的指针,arg1arg2是要运行的ClassType构造函数的参数。

当您不再需要分配的内存时,使用delete释放内存:

delete instance;

或者,您也可以使用C风格的mallocfree函数。这些不是运营商;它们是返回已分配内存地址的函数。它们不适用于C ++类实例(因为你没有在返回的内存上运行构造函数),但是如果你想运行一个纯C程序,那么它们就是你所拥有的。使用malloc,您可以执行以下操作:

char* string = malloc(size);

其中string是您要为其分配内存的指针,size是您希望系统为您分配的字节数。一旦你准备好使用内存,你可以免费发布它:

free(string);

调用deletefree时,无需指定对象的大小(系统会为您记住)。但请注意,您必须确保始终使用delete分配用new分配的内存,并始终使用free对于分配有malloc的内存。将两者混合将导致未定义的行为并可能导致崩溃。