当前位置: 动力学知识库 > 问答 > 编程问答 >

c - Process Returned -1073741819 (0xc0000005) Code::Blocks

问题描述:

I'm kind of new to programming C with Code::Blocks(Version 12.11), started this semester in my college, but I manage.

I recently learned in class about pointers, memory allocation and dynamic arrays(none are my forte), and I incorporated them in my program(and it compiles)

Now the problem comes when I run the Program and go to Menu -> Add a Product, the program terminâtes when I input a price and I receive "Process Returned -1073741819 (0xc0000005)".

I did some research and found out it's an access violation but I don't really understand how to correct it.

Regards

Here's the code:

#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;

}

}

网友答案:

An attempt is being made to write to randon memory, via the uninitialized pointer tempIdCode:

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

    system("cls");
    return tempIdCode;
}

You need to allocate memory for tempIdCode before attempting to write to it. You must use malloc() here (and not return the address of a local array):

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);
}

The caller of the function must explicitly check for a return NULL pointer. The caller must also free() the allocated memory.

网友答案:

This is a killer:

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

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

  system("cls");
  return name;
}

The reference returned by this function points to an already freed block of memory on the stack, as char name is only valid as long the program is inside the function name is declared in.

When leaving the function name is freed automagically, so any dereferencing of the function's result leads to UB, as it most propably will be accessing unallocated memory.

To solve this you might like to pass in a buffer, where to read the data into:

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

  system("cls");
  return name;
}

and call it like this:

// 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);

  ...
分享给朋友:
您可能感兴趣的文章:
随机阅读: