1

我将 char ** 类型的双指针传递给函数。在该函数内部,我需要取消引用指针,然后通过字符数组进行索引。

不幸的是,当我尝试将大写字母分配回数组时,我得到了一个核心转储。

我需要有关如何执行此操作的帮助。(这不是作业,只是个人项目。)

void buffer(char **ppline);

int main()
{
  char *line="The redcoats are coming!";

  buffer(&line); 
  printf("\nline = %s\n",line);

  return(0);
}


void buffer (char **ppline)
{

 int i=0;
 char a;

  for (i=0; i < strlen(*ppline); i++)
  {
    a = toupper( (*ppline)[i] );   /* THIS LINE CAUSES THE CORE DUMP  */
    ((*ppline)[i]) = a;
  }

  return;
}
4

2 回答 2

2

字符串文字 in""是常量。你不能像你正在做的那样修改它,因为那是未定义的行为。试试这个,它分配存储并将字符串文字复制到其中:

void buffer(char **ppline);

int main()
{
  char line[] = "The redcoats are coming!";

  buffer(&line); 
  printf("\nline = %s\n",line);

  return(0);
}


void buffer (char **ppline)
{

 int i=0;
 char a;

  for (i=0; i < strlen(*ppline); i++)
  {
    a = toupper( (*ppline)[i] );   /* THIS LINE CAUSES THE CORE DUMP  */
    ((*ppline)[i]) = a;
  }

  return;
}
于 2012-06-22T13:12:07.110 回答
1

堆栈、堆、数据段(和 BSS)和文本段是进程内存的四个段。定义的所有局部变量都将在堆栈中。使用 malloc 和 calloc 动态分配的内存将在堆中。所有的全局变量和静态变量都在数据段中。文本段会有程序的汇编代码和一些常量。

在这 4 个段中,文本段是 READ ONLY 段,而在所有其他三个段中,都是用于 READ 和 WRITE。

char []a="The redcoats are coming!";- 此语句将在堆栈中分配 25 个字节的内存(因为局部变量),并将保留所有 24 个字符加上 NULL 字符(\0)在最后。

char *p="The redcoats are coming!";- 该语句将在堆栈中分配 4 个字节(如果是 32 位机器)的内存(因为这也是一个局部变量),它将保存常量字符串的指针,其值为“The redcoats are come!”。这个字节的常量字符串将在文本段中。这是一个常数值。指针变量 p 只是指向该字符串。

现在a[0](索引可以是 0 到 24)意味着,它将访问堆栈中该字符串的第一个字符。所以我们也可以在这个位置写。a[0] = 'x'允许此操作是因为我们在堆栈中具有 READ WRITE 访问权限。

但是p[0] = 'x'会导致崩溃,因为我们对文本段只有 READ 访问权限。如果我们对文本段进行任何写入,就会发生分段错误。

但是你可以改变变量 p 的值,因为它在栈中的局部变量。像下面

char *p = "string";
printf("%s", p);
p = "start";
printf("%s", p);

这是允许的。这里我们将存储在指针变量 p 中的地址更改为字符串 start 的地址(同样 start 也是文本段中的只读数据)。如果要修改 *p 中存在的值,则意味着使用动态分配的内存。

char *p = NULL;
p = malloc(sizeof(char)*7);
strcpy(p, "string");

现在p[0] = 'x'允许操作,因为现在我们在堆中写入。

于 2012-06-22T19:30:39.407 回答