【问题标题】:Program crashing because of these pointers and arrays in C由于 C 中的这些指针和数组,程序崩溃
【发布时间】:2015-05-01 13:52:29
【问题描述】:

由于这些指针变量,我的代码崩溃了。他们怎么了?

main 中的变量声明

char* fname = (first_name_length*sizeof(char));

char* lname = (last_name_length*sizeof(char));

char* pfname = &fname[0];

char* plname = &lname[0];

功能

void get_first_name(FILE* fp, int length, char* pfname){

char c;
int i = 0;
int number_of_conversions;

//char* first_name = malloc(length*sizeof(char));

number_of_conversions = fscanf(fp, "%c", &c);

while (!isspace(c)){

    pfname[i] = c;

    number_of_conversions = fscanf(fp, "%c", &c);

}

}

【问题讨论】:

  • 你想用fname和lname的声明来完成什么?
  • 在其中存储名称?为什么在这种情况下这很重要?
  • 分配没有意义。您是否要为它们分配内存?
  • 是的。为我拥有的字符列表分配足够的内存。我正在尝试将数组从 void 函数转移到 main。
  • 在您的get_first_name 函数中,您永远不会在while 循环中推进i;你最终会反复写信给pfname[0]。

标签: c arrays pointers


【解决方案1】:
char* fname = (first_name_length*sizeof(char));
char* lname = (last_name_length*sizeof(char));

这不是您在 C 中分配内存的方式。您可以静态分配内存:

char fname[first_name_length]; //This assumes that first_ and last_name_length are
char lname[last_name_length];  //constants

或者像这样动态地:

char* fname = malloc(first_name_length*sizeof(char)); //first_ and last_name_length can
char* lname = malloc(last_name_length*sizeof(char));  //be constants or variables

【讨论】:

  • 我知道我忘记了 malloc。但它仍然崩溃。
  • 它在调试器确定的同一个地方崩溃?
  • 它说程序已经停止工作。没有说明任何问题,但是当我删除这些变量时,程序可以正常工作。
  • 为了让我们进一步帮助您,我们需要了解更多信息。处理我和 John Bode 在问题 cmets 中提到的问题。如果这不能解决您的问题,您将需要准确确定代码失败的位置。这可以通过调试器来完成,或者如果这不是一个选项,可以在代码中添加一堆 printf 语句来缩小程序失败时发生的情况。
  • 我可以告诉你程序在 pfname[i] = c; 处失败
【解决方案2】:

在前 2 行中,您将数学结果分配给字符数组尝试 字符第一个[50],最后一个[50]; char tmp[]="约翰·史密斯";

strncpy(first,tmp,4);

// new line as per comments below 

first[4]='\0';

// typo fixed below ( removed n) 

strcpy (last,tmp+5);

char *pfirst =&first[0];

// or more correctly 
char *plast =last

【讨论】:

  • 这种strncpy()的使用不会0-终止目标char-arrays,因此它们不是有效的C-“字符串”。同样对于第二次调用strncpy(),缺少第三个参数。
  • 是的,你说得对,我会编辑我的答案。问题是我只是用我的手机来做这个,没有 gcc,所以我无法验证我的代码。你投反对票了吗?
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 2018-02-22
  • 1970-01-01
相关资源
最近更新 更多