c - 读取访问冲突变量

标签 c visual-studio visual-c++

当我在 int main() 函数中使用 char* pilih(char teks[]) 时,它正在工作。但是当我在新函数中使用这个函数时,它说读取访问冲突。请帮助我

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define MAXARR 1000
char *hilangkan(char[]);
char *pilih(char[]);
char *loadFile(FILE *sumber);

int main(){
    FILE *sumber;
    sumber=fopen("kumpulan.txt","r");
    char *teks=loadFile(sumber);
    char *pilihan=pilih(teks);
    printf("%s",pilihan);
    printf("%s",hilangkan(pilihan));
}

char *hilangkan(char teks[]){
    char *penghilangan;
    strcpy(penghilangan,teks);
    int y=strlen(penghilangan);
    srand(time(NULL));
    int c=48;
    for(int i=0;i<y;i++){
        int hilang=rand()%y+1;
        penghilangan[hilang]='_';
    }
    return penghilangan;
}
char *loadFile(FILE *sumber){
    char *teks;
    if (sumber == NULL) {
        printf("ERROR!!!");
        system("pause");
        return 0;
    }
    char h;
    int count=0;
    while (h = fgetc(sumber) != EOF) { 
        teks[count] = h; 
        count++;
    }
    fclose(sumber);
    return teks;
}
char *pilih(char teks[]){
    char *hasil;
    srand(time(NULL));
    int w = rand() % 47 + 1;
    char cek[3];
    itoa(w, cek, 10);
    char *c=strstr(teks, cek);
    int lokasi = c - teks + 1;
    int pan = strlen(cek);
    int i;
    if (pan == 2)i = -1;
    else i = 0;
    while (teks[lokasi]!='\n') {
        hasil[i] = teks[lokasi];
        i++;
        lokasi++;
    }
    hasil[i] = NULL;
    return hasil;
}

while(teks[lokasi]!='\n') 上,它表示读取冲突访问。 teks0x1110113

最佳答案

强烈建议不要使用链接,您的期望是,您应该在问题中发布整个程序。
从您发布的代码部分和共享的错误信息来看,传递给 pilih() 函数的参数似乎无效,这反过来又使 teks 指针指向一些无效的内存。只有在查看描述问题行为的最小、完整且可验证的程序后才能给出问题的实际原因。 pilih() 函数中的一个确认问题是您正在从中返回一个局部变量 hasil。局部变量 hasil 的作用域和生命周期仅限于 pilih() 函数,一旦 pilih() 函数退出,它就不再有效。

另外,这个声明

hasil[i] = NULL;

不正确。变量 hasilchar 数组,hasil[i] 是索引 i 处的字符。您正在为其分配无效的NULL。我想你想这样做:

hasil[i] = '\0';
<小时/>

编辑:

完整的代码已发布在问题中。因此编辑我的答案并指出OP代码中的问题。

您的代码中有几个问题。如果您使用 gcc 编译器,请尝试使用“-Wall -Wextra”选项编译代码,并检查编译器给出的警告消息。

在函数loadFile()中,看一下这个语句:

while (h = fgetc(sumber) != EOF) {

首先,fgetc()函数的返回类型是int而不是char[fgetc () 返回类型为 int 以适应特殊值 EOF]。在运算符优先级表中,运算符 != 位于 = 之前,因此您不会得到分配给 h 的读取字符,而是得到以下结果: fgetc(sumber) != EOF 将被分配给 h。这应该是

while ((h = fgetc(sumber)) != EOF) {  // check the parenthesis added
       ^                 ^

在此声明中:

teks[count] = h;

您正在访问一个未初始化的指针。 任何未初始化的变量都具有不确定的值,指针也是如此。它们可以指向任何随机的不确定地址。没有默认行为。只有行为是不确定的,并且使用不确定的值会导致未定义的行为

您应该在使用teks之前为其分配内存,如下所示:

teks = malloc(100 * sizeof (char)); //this will allocate memory for 100 characters.
if (teks == NULL)
   exit(EXIT_FAILURE);

看起来您想将整个文件内容存储在 teks 中。确保为 teks 分配足够的内存,如果您不确定所需的内存大小,那么 realloc 是您的好 helper 。

此外,在 while 循环之后,您应该在 teks 中存储的内容末尾添加终止空字符,如下所示:

teks[count] = '\0';

hilangkan()pilih() 函数中也存在访问未初始化指针的相同错误。分别检查变量penghilanganhasil

strstr()可以返回NULL指针。您应该添加检查:

char *c=strstr(teks, cek);
if (c == NULL)
   return NULL; // Or whatever the way you want to handle this case
                // but you should not use c

在每个函数中使用参数值之前,您应该检查它。如果是指针,检查是否为NULL。如果它不是 NULL 则仅使用它。

此外,请确保在使用完动态分配的内存后释放它。

我不知道你到底想做什么,但我觉得你的代码有很大的改进空间。

希望这有帮助。

关于c - 读取访问冲突变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53941967/

相关文章:

c - 如果存储了 Thrust device_vector 的 .begin() 迭代器,它在 resize() 之后是否仍指向正确的位置?

c - 为什么在此 C 程序中写入字符串文字会出现段错误?

c# - 如何在 Visual Studio 2008 中获取线程窗口?

c++ - 使用单例创建对话框

c++ - 在静态断言和运行时错误之间自动选择

被调用的对象不是函数 - 如何正确嵌套 header 来调用方法

c - (练习 1.6 K&R)如何验证 getchar() != EOF 是 0 还是 1?

c++ - 从 MSVS2005 到 MSVS2010 的端口 : I canno longer find ReadProcessorPwrScheme()

C# SQL SELECT WHERE <variable> LIKE %Column% - 格式?

c++ - 实际从堆中为一个对象分配了多少内存?