是什么导致程序崩溃在下面的代码片段?

时间:2017-05-07 19:39:27

标签: c string visual-studio-2013

我试图在C中编写一段代码,从文件中获取输入(作为字符串),并将其添加到另一个字符串的末尾并打印出来。 该程序在Visual Studio 2013中完美编译,但在运行期间崩溃。 任何人都可以帮我识别代码中的问题。

以下是代码:

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    char input[255];
    char str1 = "caingb";
    char str2 = " ";
    FILE *f;
    f = fopen("rockyou.txt", "rt");
    while (fgets(input, sizeof(input), f))
    {
        str2 = str1 + input;
        printf("%s", str2);
    }
    fclose(f);
    return(0);
}

以下是我收到的三条警告信息:

  • 第8行:warning C4047: 'initializing' : 'char' differs in levels of indirection from 'char [7]
  • 第9行:warning C4047: 'initializing' : 'char' differs in levels of indirection from 'char [2]
  • 第14行:warning C4047: '=' : 'char' differs in levels of indirection from 'char *

1 个答案:

答案 0 :(得分:-2)

如果您想在C中连接字符串,则必须使用strcat。 如果您想将一个字符串复制到另一个字符串,则必须使用strcpy ... 简而言之,对于C中的字符串赋值,您必须使用内置函数(strcpy,strcat,memcpy,snprintf等)。您不能像以前那样简单地使用=运算符!

所以你的代码会是这样的:

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
int main()
{  
    char input[255];
    char *str1 = (char*)malloc(sizeof(char)*10);
    strcpy(str1,"caingb");
    char *str2=(char)0; //point to null..for initilization!
    FILE *f;
    f = fopen("rockyou.txt", "rt");
    while (fgets(input, sizeof(input), f))
    {
        str2=(char*)malloc(sizeof(char)*(strlen(str1)+strlen(input))+1);
        strcpy(str2,str1);
        strcat(str2,input);
        printf("%s", str2);
        free(str2);
    }
    fclose(f);
    free(str1);
    return(0);
}

在上面代码的2行出现malloc函数时,你基本上是在内存上分配空间,以存储malloc从中调用的变量。在你的第二个malloc中,你需要每个字符的大小(sizeof(char))乘以字符串1(strlen(str1))的长度加上字符串2的长度('strlen(input){ {1}} str2 ). That will give you the required memory in HEAP of your program to store“caingb”`我6个字符(所以我保留了几个字节......如果你想成为一个好的程序员,这不是一个好策略;-))。稍后通过免费调用,你将使用malloc取消分配你保留的空间,因为如果不这样做,即使程序执行完毕,它也会像这样留在内存中!

一个更抽象的malloc概念(例如用途)将是

. For the first malloc i am just multiplying it by 10, since

...就像你为指针char* string=malloc(15); 分配了15个字节的内存。所以无论这个指针指向什么,都不能超过15个字节,否则你会有内存泄漏(在C中也称为segmantation fault)。

要进一步阅读,请在C中搜索自己的程序堆栈和堆。

也总是通过你的终端(在Linux中)试用手册页。这方面的一个例子是:

char *string ..并且你会得到一个关于malloc的手册页。一开始阅读这些手册可能看起来有点苛刻,但给自己一点时间!在http://man.he.net/

还有一个在线版本

P.S。我没有运行上面的代码,但这就是一般的想法。