【问题标题】:Trying to use typedef struct and struct arrays. Why am I getting a "segmentation fault"? [closed]尝试使用 typedef struct 和 struct 数组。为什么我会收到“分段错误”? [关闭]
【发布时间】:2014-02-24 02:41:50
【问题描述】:

我正在学校学习 C,我将在课堂上编写一个程序,该程序接收一个文件并将信息存储到一个结构数组中,然后使用该数组来确定是否有足够的可用库存。我尝试在全局范围内使用 struct 数组,并花了几个小时试图将它传递给函数并在 main 中声明它。但是,我仍然将分段错误视为错误,我不知道我的确切问题是什么。

typedef struct
{
    char        szStockNumber[7];           // Stock Number for a stock item
    long        lStockQty;                  // quantity in stock
    double      dUnitPrice;                 // price per unit of stock
    char        szStockName[31];            // name of the stock item
} Inventory;

#define MAX_INVENTORY 20;

void readWriteInventory(Inventory inventoryM[]);

int main(int argc, char *argv[])
{
    char            *pszOrderFileName = NULL;
    char            *pszInventoryFileName = NULL;
    int             rc;


    Inventory inventoryM[MAX_INVENTORY];

    readWriteInventory(inventoryM);

    return 0;
}

   void readWriteInventory(Inventory inventoryM[])
{

int         iInventoryCnt = 0;                  // number of inventory items
char        szInputBuffer[100];
char        *pszGetsResult;
int         iScanfCnt;

fprintf(stdout, "%-6s %-8s %-10s %-30s\n", "Stock", "Quantity", "Unit Price", "Stock Name");

/* get inventory data until EOF
** fgets returns null when EOF is reached.
** store inventory in array
*/

pszGetsResult = fgets(szInputBuffer, 100, pfileInventory);

int i;
for(i = 0; i < MAX_INVENTORY; i++)
{
    if (pszGetsResult != NULL)
    {
        iScanfCnt = sscanf(szInputBuffer, "%6s %8ld %10lf %30[^\n]"
            , inventoryM[i].szStockNumber
            , &inventoryM[i].lStockQty
            , &inventoryM[i].dUnitPrice
            , inventoryM[i].szStockName);

        // Check for bad input.  scanf returns the number of valid conversions
        if (iScanfCnt < 4)
            exitError(ERR_INVALID_INVENTORY_DATA, szInputBuffer);

        fprintf(stdout, "%6s %8ld %10.2lf %30s\n"
            , inventoryM[i].szStockNumber
            , inventoryM[i].lStockQty
            , inventoryM[i].dUnitPrice
            , inventoryM[i].szStockName);

        iInventoryCnt++;

        if(iInventoryCnt > MAX_INVENTORY)
            exitError(ERR_TOO_MANY_STOCK_ITEMS, szInputBuffer);

        pszGetsResult = fgets(szInputBuffer, 100, pfileInventory);
    }
    else
        break;
}
}

【问题讨论】:

  • 你试过使用调试器吗?
  • 当您尝试将数组写入越界时,可能会发生分段错误。
  • 你传递了什么输入数据?
  • 您能展示一些数据文件的示例输入吗?程序是否在分段错误之前打印出任何数据?
  • 请不要从您的帖子中删除代码。

标签: c arrays segmentation-fault parameter-passing typedef


【解决方案1】:

我要走投无路了——如果你改变了怎么办:

if(iInventoryCnt > MAX_INVENTORY)

到

if(iInventoryCnt >= MAX_INVENTORY)

这样,如果iInventoryCnt等于20,程序就不会尝试进入InventoryM的第20个元素(这是越界,因为19是最大值)。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2021-03-21
    • 2012-12-22
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多