【问题标题】:Segmentation fault (core dump) issue, stack分段错误(核心转储)问题,堆栈
【发布时间】:2014-02-25 13:06:19
【问题描述】:

我不知道我哪里出错了,任何帮助都会有所帮助。我正在尝试用 2 个不同的字符串数组制作一副卡片并将其打印到控制台。它编译得很好,但是当我运行它时,我得到“分段错误(核心转储)”

/*
* BlackJack.c
*
*  Created on: Feb 25, 2014
*      Author: Danny Hunn
*      25 Feb 14 builds a deck for Black Jack
*/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define NUM_SUITS 4
#define DECK_SIZE 52
#define NUM_RANKS 13


void swap(char *first,char *second)// swapping pointers
{
char temp = *first;
*first = *second;
*second = temp;

}
void shuffle(char *deck[])
{
int seed, gen, i;
seed = (int) time(0);
srand(seed);

for(i =0; i < DECK_SIZE; i++ )
{
        gen = rand()%52;
        swap(deck[i],deck[gen]);

}

 }
 void printDeck(char *deck[])
 {
int i;
for(i=0;i<DECK_SIZE; i++)
{
    printf("%s\n", deck[i]);
}
 }

int main(int argc, char *argv[]) {
int deckIndexs = 1;
char *suit[NUM_SUITS] = {" Spades", " Hearts", " Diamonds", " Clubs"};
char *rank[NUM_RANKS] = {"Ace", "Two","Three","Four","Five","Six", "Seven", "Eight",         "Nine",
        "Ten", "Jack", "Queen", "King"};
char **deck = malloc(deckIndexs * (sizeof(*deck)));
int i,j,k;
k=0;
for(i=0; i< NUM_SUITS; i++)
{
    for(j=0; j< NUM_RANKS; j++)
    {
        char *suitTemp = suit[i];
        char *rankTemp = rank[j];
        strcat(rankTemp, suitTemp);
        deck= realloc(deck, (deckIndexs +1)*sizeof(*deck));// reallocate    memory for the size of the array
        deckIndexs++;
        deck[k] = malloc(254*sizeof(char *));// allocate memory for the new  string index
        deck[k] = rankTemp;
             k++;// increments k for the index of the array
    }

}
printDeck(deck);
shuffle(deck);

return 0;
 }

【问题讨论】:

  • 在不了解您的代码的情况下,双重 k++ 看起来很可疑。
  • 在调试器中运行。它会在崩溃发生时停止,让您检查函数调用堆栈以及让您向上走调用堆栈。转到您的代码(如果您还没有),您可以打印变量的值。当然,您必须使用调试信息(-g 标志 gcc/clang)进行构建。如果不出意外,请编辑您的问题以在崩溃发生时包含函数调用堆栈。
  • 请格式化您的代码。
  • char *rankTemp = rank[i]; 不应该是rank[j] 吗?
  • 我很抱歉我来自java并且刚刚开始学习c

标签: c stack


【解决方案1】:

你不能使用strcat(rankTemp, suitTemp);,因为rankTemp指向一个字符串字面量,这样做你会修改字符串字面量那个非法内存指令,并且操作系统可以检测到对有效内存的无效访问然后os发送SIGSEGV这会导致核心转储。

【讨论】:

  • 在 strcat(rankTemp, suitTemp) 处崩溃;有关如何修复的任何建议?
  • @drhunn 是的,首先更改char* str[] to char str[][] 保持足够大的长度,以便新字符串可以连接并读取this answer
【解决方案2】:

我认为你的问题在这里

void swap(char *first,char *second)// swapping pointers
{
char temp = *first;
*first = *second;
*second = temp;

}

应该是

void swap(char *first,char *second)// swapping pointers
{
char * temp = first;
first = second;
second = temp;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2015-06-27
    • 2021-06-03
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多