-1

我无法弄清楚的 c 函数“strcpy”有问题。

它涉及复制到像 Argv 这样的 char *[] (但实际上不是 Argv)。我可以从结构中复制出来,但不能复制进来。但前提是我最初一次性声明了整个 Argv 结构。

我假设 achar *[]是和数组char*

这是该问题的简单演示程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char FN[]="BBBB";   

char *TL[]={
 "a0                ",
 "a1                ",
 "a2                ",
 "a3                ",
 "a4                ",
 "a5                "};

 char BN[]="c1                    ";

 char N0[]="N0                    ";
 char N1[]="N1                    ";
 char N2[]="N2                    ";
 char N3[]="N3                    ";
 char N4[]="N4                    ";
 char N5[]="N5                    ";

 char* TD[6]; 


 int main ( int argc, char *argv[] )
 {

    // FN is a pointer to an array of chars
    // BN is the same

    //TL is an array of pointers (that each point to an array of chars)

    //TL[1] is thus a pointer to an array of chars

    //TL is the same structure as Argv

    //TD is the same structure as Argv  (but built up from parts)
    //  but is spread out across the globals and the main func.
    //  thus less easy to read and understand then TL.

    //TL[i], TD[i], and BN are initially allocated significantly larger than FN
    //  to remove the worry of overruns.

    //copy "a1                \0" into the space held by "c1   "
    strcpy(BN,TL[1]); //works

    //copy "BBBB\0" into the space held by "c1   "
    strcpy(BN,FN); //works

    TD[0]=N0;
    TD[1]=N1;
    TD[2]=N2;
    TD[3]=N3;
    TD[4]=N4;
    TD[5]=N5;

    //copy "BBBB\0" into the space held by "a1   "
    strcpy(TD[1],FN); //works

    //copy "BBBB\0" into the space held by "a1   "
    //strcpy(TL[1],FN); //dies



}
4

2 回答 2

4

您的char指针指向字符串文字。那些是不可写的。即使它们的类型是char*出于历史原因,您也应该始终将它们视为char const *.

要么mallocchar缓冲区提供空间,要么使用数组数组。

于 2013-09-07T14:49:16.380 回答
1

作为 dasblinkenlight 在上述评论中发布的链接,

char * p = "xyz"; is different from 

char p[] = "xyz"; 

第一个是不可变的,第二个是可变的。

为什么写入用“char *s”而不是“char s[]”初始化的字符串时会出现分段错误?

于 2013-09-07T16:02:26.433 回答