这是我正在使用的课程。
#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;));它运行。我希望解决这个问题。
答案 0 :(得分:1)
char *enc;
strcpy(enc,en.EncryptString("It is C's Lounge!! "));
你没有为副本提供任何空间 - enc并不指向任何地方。
答案 1 :(得分:0)
你永远不会分配任何记忆。
当你说
时char *foo;
您告诉编译器您要将内存地址存储到某处的某些数据,但不您还要存储某些数据。您的类存储两个指针(int *k
和char *temp
),它们永远不会分配任何内存,您的主要函数char *enc
也是如此。这永远不会奏效。
在C和C ++中,有两种内存分配模式:一种是基于堆栈的分配,您可以在函数中声明变量名称,编译器或运行时将自动分配和释放为你记忆;另一个是基于堆的分配,您可以在运行时使用malloc
或new
分配内存,并且必须手动再次释放该内存使用delete
或free
。
指针是&#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
是您要存储刚刚创建的实例的地址的指针,arg1
和arg2
是要运行的ClassType
构造函数的参数。
当您不再需要分配的内存时,使用delete
释放内存:
delete instance;
或者,您也可以使用C风格的malloc
和free
函数。这些不是运营商;它们是返回已分配内存地址的函数。它们不适用于C ++类实例(因为你没有在返回的内存上运行构造函数),但是如果你想运行一个纯C程序,那么它们就是你所拥有的。使用malloc,您可以执行以下操作:
char* string = malloc(size);
其中string
是您要为其分配内存的指针,size
是您希望系统为您分配的字节数。一旦你准备好使用内存,你可以免费发布它:
free(string);
调用delete
或free
时,无需指定对象的大小(系统会为您记住)。但请注意,您必须确保始终使用delete
分配用new
分配的内存,并始终使用free
对于分配有malloc
的内存。将两者混合将导致未定义的行为并可能导致崩溃。