当前位置: 首页 > 知识库问答 >
问题:

进程返回-1073741819(0xc0000005)代码::块

充小云
2023-03-14

我是使用Code::Blocks(版本12.11)编程C的新手,本学期在我的大学开始,但我管理。

最近,我在课堂上学习了指针、内存分配和动态数组(没有一个是我的专长),并将它们纳入了我的程序(它可以编译

现在问题来了,当我运行程序并转到菜单-

当做

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define maxCharName 64
#define maxCharUserPass 8
#define maxCharId 5

// Product Structure
typedef struct{
    char name[maxCharName];
    char idCode[maxCharId];
    float price;
    float stock;
}product;

// DataBase of Products
typedef struct{
    int sizeT;
    product *array;
} TProducts;

TProducts a;


// Press any Key on the Keyboard to Proceed
void pressKeyToContinue(){
    puts("\n\n\n     Please Press any Key to Continue...");
    getchar();
}

// Start Page
void startPage(){
    puts("\n\n\n                      -- Welcome to WeePro Manager --\n\n");
    puts("                             -- Version 1.0 --\n\n\n\n");
    puts("                    -- Developped By: Nick --");

    pressKeyToContinue();
    system("cls");
    }

// Program Terminator
void shutdown(){
    puts("\n\n\n      Good-Bye");
    pressKeyToContinue();               // Awaits User Input
    exit(0);
}

// Asks User Information for Verification
int userLogin(){
    char userName[maxCharUserPass] = "WPuser";
    char inputUserName[maxCharUserPass];

    char passWord[maxCharUserPass] = "12345";
    char inputPassWord[maxCharUserPass];

    printf("Username?     ");
    scanf("%s",inputUserName); fflush(stdin);

    printf("Password?     ");
    scanf("%s", inputPassWord); fflush(stdin);

    system("cls");

    if((strcmp(userName, inputUserName) == 0)&&(strcmp(passWord, inputPassWord) == 0)){
        return 1;
    }else{ return 0;}
}

// Lists All Products With their Respective Information
void listAll(){
    int idx = 0;
    puts("List:");
    while((idx < a.sizeT)&&(a.array[idx].name != NULL)){
        printf(":::%s ( id: %s )", a.array[idx].name, a.array[idx].idCode);
        printf("Price: %6.2f eur/g", a.array[idx].price);
        printf("Stock: %6.2f g", a.array[idx].stock);

        idx++;
    }

    pressKeyToContinue();
    system("cls");
}

// Input Product ID Code
char* inputIdCode(){
    char* tempIdCode;
    puts("ID Code?");
    scanf("%s", tempIdCode);

    system("cls");
    return tempIdCode;
}

// Search By ID Code
int searchIdCode(){
    int idx = 0;
    char* tempIdCode;
    tempIdCode = inputIdCode();
    do{
        if(strcmp(a.array[idx].idCode, tempIdCode) == 0){
            return idx;
        }else{
            idx++;
        }
    }while(idx < a.sizeT);

    puts("No Product With Such an ID Code!");
    return -1;
}



// Input Product Name
char *inputProductName(int length){
    char name[maxCharName];

    puts("Product Name?");
    scanf("%s", name); fflush(stdin);

    system("cls");
    return name;
}

// Input Product Price
float inputProductPrice(int length){
    float price;

    puts("Product Price?");
    scanf("%f", price); fflush(stdin);

    system("cls");
    return price;
}

// Input Product Stock
float inputProductQuantity(int length){
    float quantity;

    puts("Product Stock?");
    scanf("%f", quantity); fflush(stdin);

    system("cls");
    return quantity;
}


/////////////////
// Add Product //
/////////////////

// New Product Adder
void addProduct(){
    char* tempStr;
    float temp;

    if(a.sizeT == 0){
        a.sizeT = 1;
        a.array = (product*)malloc((a.sizeT)*sizeof(product));
    }else{
        a.sizeT++;
        a.array = (product*)realloc(a.array, (a.sizeT)*sizeof(product));
    }

    tempStr = inputProductName(a.sizeT);
    strcpy(a.array[a.sizeT].name, tempStr);
    temp = inputProductPrice(a.sizeT);
    temp = inputProductQuantity(a.sizeT);

    system("cls");
}

void transaction(){}


////////////////////
// Delete Product //
////////////////////

// Delete Product
void deleteProduct(){
    int idx, idxPro;
    char* tempIdCode;

    puts("Delete Which Product?\n");
    tempIdCode = inputIdCode();
    idxPro = searchIdCode(tempIdCode);

    idx = idxPro + 1;
    while(idx < a.sizeT){
        a.array[idx] = a.array[idx+1];
        idx++;
    }
    a.array = realloc(a.array, (a.sizeT-1)*sizeof(product));
}

//Product Information Modifier
void modifyProduct(){
    char choice;
    int tabLength;
    do{
        puts("Modify What?\n");
        puts("   -> [N]ame\n");
        puts("   -> [P]rice\n");
        puts("   -> [S]tock\n\n");
        puts("   -> [R]eturn to Previous Menu");                    // Prints the Menus' Options

        scanf("%c", &choice);
        choice = toupper(choice);                               // Save Users' Choice And Up Case
        fflush(stdin);

        switch(choice){
            case 'N':
                    system("cls");
                    tabLength = searchIdCode();
                    inputProductName(tabLength);
                    break;
            case 'P':
                    system("cls");
                    tabLength = searchIdCode();
                    inputProductPrice(tabLength);
                    break;
            case 'S':
                    system("cls");
                    tabLength = searchIdCode();
                    inputProductQuantity(tabLength);
                    break;
            case 'R':
                    system("cls");
                    returnToMenu2();
                    break;
            default:
                puts("Something Went Wrong!\n");
                pressKeyToContinue();
                system("cls");
        }

    }while(choice != 'o');
}

// Sub-Menu Interface
void menu(){
    char choice;
    do{
        puts("Please Make Your Selection.\n");
        puts("   -> [A]dd a New Product\n");
        puts("   -> [M]odify a Product\n");
        puts("   -> [D]elete a Product\n\n");
        puts("   -> [R]eturn to Main Menu");                    // Prints the Menus' Options

        scanf("%c", &choice); fflush(stdin);
        choice = toupper(choice);                               // Save Users' Choice And Up Case

        switch(choice){
            case 'A':
                    system("cls");
                    addProduct();
                    break;
            case 'M':
                    system("cls");
                    modifyProduct();
                    break;
            case 'D':
                    system("cls");
                    deleteProduct();
                    break;
            case 'R':
                    system("cls");
                    returnToMenu1();
                    break;
            default:
                    puts("Something Went Wrong!\n");
                    pressKeyToContinue();
                    system("cls");
        }
    }while(choice != 'o');
}

// Return To Ma

> Blockquote

in Menu
void returnToMenu2(){
    menu();
}

// Main Menu
void controlPanel(){
    char choice;
    do{
        puts("Please Make Your Selection.\n");
        puts("   -> [T]ransaction\n");
        puts("   -> [M]enu\n");
        puts("   -> [L]ist\n");
        puts("   -> [S]hutdown");                                        // Prints the Panels' Options

        scanf("%c", &choice); fflush(stdin);
        choice = toupper(choice);                                   // Save Users' Choice And Up Case

        switch(choice){
            case 'T':
                    system("cls");
                    transaction();
                    break;
            case 'M':
                    system("cls");
                    menu();
                    break;
            case 'L':
                    system("cls");
                    listAll();
                    break;
            case 'S':
                    system("cls");
                    shutdown();
                    break;
            default:
                    puts("Something Went Wrong!\n");
                    pressKeyToContinue();
                    system("cls");
        }
    }while(choice != 'o');
}

// Return To Main Menu
void returnToMenu1(){
    controlPanel();
}


int main(){
    int loginSuccess=1;

    //loginSuccess = userLogin();

    switch(loginSuccess){
    case 0:
        shutdown();
        break;

    case 1:
        startPage();
        controlPanel();
        break;
    }
}

共有2个答案

叶稳
2023-03-14

这是一个杀手:

// Input Product Name
char *inputProductName(int length){
  char name[maxCharName];

  puts("Product Name?");
  scanf("%s", name); fflush(stdin);

  system("cls");
  return name;
}

此函数返回的引用指向堆栈上已释放的内存块,因为仅当程序位于函数名称声明时,char 名称才有效。

当离开函数时,函数< code>name会自动释放,因此函数结果的任何解引用都会导致UB,因为它很可能会访问未分配的内存

要解决这个问题,您可能需要传入一个缓冲区,将数据读入其中:

// Input Product Name
char * inputProductName(int length, char * name){
  puts("Product Name?");
  scanf("%s", name); fflush(stdin);

  system("cls");
  return name;
}

这样称呼它:

// New Product Adder
void addProduct(){
  char* tempStr;
  float temp;

  if(a.sizeT == 0){
    a.array = malloc((a.sizeT)*sizeof(product));
  }else{
    a.array = realloc(a.array, (a.sizeT)*sizeof(product));
  }

  a.sizeT++;

  inputProductName(a.sizeT, a.array[a.sizeT].name);

  ...
有德业
2023-03-14

试图通过未初始化的指针< code>tempIdCode写入随机内存:

char* inputIdCode(){
    char* tempIdCode;
    puts("ID Code?");
    scanf("%s", tempIdCode);

    system("cls");
    return tempIdCode;
}

在尝试写入temIdCode之前,您需要为它分配内存。您必须在此处使用malloc()(并且不返回本地数组的地址):

char* tempIdCode = malloc(20);
if (tempIdCode)
{
    /* The format specifier "%19s" instructs scanf()
       to read at most 19 characters, one less than
       allocated to allow for terminating null character
       written by scanf(), to prevent potential buffer
       overrun. */
    scanf("%19s", tempIdCode);
}

函数的调用方必须显式检查返回的 NULL 指针。调用方还必须释放() 分配的内存。

 类似资料:
  • 本文向大家介绍IDEA进程已结束,退出代码-1073741819 (0xC0000005)的bug,包括了IDEA进程已结束,退出代码-1073741819 (0xC0000005)的bug的使用技巧和注意事项,需要的朋友参考一下 由于昨天要写的文章没有写完,于是今天早上我四点半就“自然醒”了,心里面有事,睡觉也不安稳。洗漱完毕后,我打开电脑,正襟危坐,摆出一副要干架的态势,不能再拖了。 要写的文

  • 问题内容: 我正在使用SUSE SLES 11在POWER7系统上运行多程序工作负载(基于SPEC CPU2006基准)。 有时,工作负载中的每个应用程序都会消耗大量内存,并且总内存占用量会超过系统中安装的可用内存(32 GB)。 我禁用了交换,因为否则使用交换的过程可能会严重影响测量结果。我知道通过这样做,内核可以通过OOM杀手来杀死某些进程。很好 问题是我希望内核杀死的线程以错误条件退出(例如

  • null -启动 ./common/plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --Launcher.Library C:\Program Files\java\jre1.8.0_71\bin\javaw.exe -配置 H:\mye\myeclipse 10\配置 -vmargs -XMX512M

  • 我试图通过require($page.“.php”)传递一个页面;但是,它只是从页面返回代码。变量$page连接到products页面。代码如下所示。...索引页... 产品列表 第名称第价格 产品ORDER BY name ASC”;$Query=mysql_query($SQL);而($ROW=mysql_fetch_array($query)或die(mysql_error())){?><?

  • 问题内容: 我想测试在32位操作系统上是否可以通过乘法进程使用超过4GB的内存(我的:具有1GB内存的Ubuntu)。 因此,我编写了一个小程序,该程序的malloc小于1GB,并对该数组进行了一些操作,并运行了该程序的5个实例。 事实是,我怀疑OS杀死了其中的4个,只有一个幸存下来并显示为“ PID:我完成了”。 (我已经尝试过使用小型阵列并进行5次打印,而且当我使用TOP查看正在运行的进程时,

  • 编辑问题以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将有助于其他人回答这个问题。 代码不返回值,而是返回“?”。编译时我没有遇到任何错误。请协助。 代码需要返回需要支付的剩余金额。输出代码1代码2代码3代码4