C 取消对双指针的引用并使用索引运算符

C 取消对双指针的引用并使用索引运算符,c,string,pointers,C,String,Pointers,我正在向函数传递char**类型的双指针。在该函数中,我需要取消对指针的引用,然后通过字符数组进行索引 不幸的是,当我尝试将大写字母分配回数组时,我得到了一个核心转储 我需要关于如何做这件事的帮助。(这不是家庭作业,只是个人项目。) void缓冲区(字符**ppline); int main() { char*line=“红衣人来了!”; 缓冲区(&行); printf(“\n行=%s\n”,第行); 返回(0); } 无效缓冲区(字符**应用程序) { int i=0; 字符a; 对于(i=0

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

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

我需要关于如何做这件事的帮助。(这不是家庭作业,只是个人项目。)

void缓冲区(字符**ppline);
int main()
{
char*line=“红衣人来了!”;
缓冲区(&行);
printf(“\n行=%s\n”,第行);
返回(0);
}
无效缓冲区(字符**应用程序)
{
int i=0;
字符a;
对于(i=0;i
中的字符串文字是常量。您不能在执行时修改它,因为这是未定义的行为。尝试以下操作,分配存储并将字符串文本复制到其中:

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;
}
void缓冲区(字符**ppline);
int main()
{
char line[]=“红衣人来了!”;
缓冲区(&行);
printf(“\n行=%s\n”,第行);
返回(0);
}
无效缓冲区(字符**应用程序)
{
int i=0;
字符a;
对于(i=0;i
堆栈、堆、数据段(和BSS)和文本段是进程内存的四个部分。所有定义的局部变量都将在堆栈中。使用malloc和calloc动态分配的内存将在堆中。所有全局变量和静态变量都将在数据段中。文本段将包含程序的汇编代码和一些常量

在这四个段中,文本段是只读段,而在所有其他三个段中,文本段是读写段

char[]a=“红衣人来了!”-此语句将为堆栈中的25个字节分配内存(因为本地变量),并将所有24个字符加上空字符(\0)保留在末尾

char*p=“红衣人来了!”-此语句将为堆栈中的4个字节(如果是32位机器)分配内存(因为这也是一个局部变量),并将保存常量字符串的指针,该字符串的值为“红衣人来了!”。常量字符串的这个字节将位于文本段中。这是一个常量值。指针变量p只指向该字符串

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

但是
p[0]=“x”
将导致崩溃,因为我们只有对文本段的读取权限。如果我们在文本段上写任何内容,都会出现分段错误

但您可以更改变量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'
操作,因为现在我们正在堆中写入

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