【问题标题】:Array of pointer to char width typedef指向字符宽度 typedef 的指针数组
【发布时间】:2013-11-13 20:15:00
【问题描述】:

我正在尝试创建一个指向 char 的指针数组。 我决定使用 typedef 定义,但我不知道做错了什么......

typedef struct _pp{
    char* a[10];
    int b;
}pp;

int main(){
  pp *taa = (pp* )malloc(sizeof(pp));
  taa->b = 2;
  printf("%d\n", taa->b);
  taa->a[1]=(char* )malloc(strlen("Peter")+1);
  strcpy((taa->*a[1]), "Peter");

  printf("%s\n", taa->*(a[1]));
  /*

/行得通/

  int i;  
  int* a[5];
  for(i=0;i<5;i++){
    a[i]=(int* )malloc(sizeof(int));
    **(a+i)=i+100;
    printf("%d\n", **(a+i));
  */}

已编辑

这是好的做法吗?

  for(i=0;i<10;i++){
    taa->a[i]=(char* )malloc(strlen("Peter")+1);
    strncpy((taa->a[i]), "Peter", strlen("Peter"));
  }
  for(i=0;i<10;i++){
    printf("%s\n", taa->a[i]);
  }

问题 3) taa-&gt;*a[1] 等同于 ta.***(a + i)

printf("%c",*taa->a[1]);  It dereference 'P' character, how i can get acces to 'e'?

printf("%c",*(taa-&gt;a[1]+0));

printf("%c",*(taa-&gt;a[1]+1)); 就是这样……

【问题讨论】:

  • 那么,你遇到了什么错误,在哪一行代码上?
  • 虽然 C++ 有 -&gt;* 运算符,但我认为它在 C 中不可用...
  • 它是,至少在我的编译器上,
  • 如果这是 C(如标记),please don't cast the return value of malloc().
  • @user2533527 你用的是什么编译器?因为en.wikipedia.org/wiki/… 不同意你所说的……虽然它在 C++ 中可用并且做一些不同的事情。

标签: c pointers char malloc typedef


【解决方案1】:

试试:

strcpy((taa->a[1]), "Peter");

还要注意[1] 正在访问数组中的第二个元素;第一个使用[0]。最好使用strncpy 或“安全”的东西,你可以将你的字符缓冲区(字符串)的长度传递给它来阻止内存被乱写。

编辑:

非标准的安全字符串函数:

strlcpy

strcpy_s

【讨论】:

  • strcpy_s 不是标准 C
  • @user4815162342: strcpy_s() 是 C11 的可选部分 — ISO/IEC 9899:2011(附件 K,规范)。但是,唯一可用的平台是带有 MSVC 的 Microsoft Windows。
  • 我认为它只适用于gets()函数en.wikipedia.org/wiki/C11_%28C_standard_revision%29
  • @nonsensickle:什么“仅适用于gets() 函数”?
  • @JonathanLeffler 点了。改为strncpy!!
【解决方案2】:

strcpy 函数的第一个参数需要 char* 类型。 在您的 pp struct 中,您有十个 char*s。您正在使用taa-&gt;a[1] 访问您的第二个char*。所以在-&gt; 之后删除* 会给你你需要的东西。 这工作正常:

strcpy((taa->a[1]), "Peter");

【讨论】:

  • 你的意思是除了-&gt;*在C语言中是非法的语法吗?
  • taa->*a[1] 等于 ta.***(a + i) i 东西...有三个级别的递减..
  • @nonsensickle,我记得,MinGW 抱怨-&gt;**taa-&gt;a[i] 没问题。 @XosLamoo 我不知道***(a+i) 是关于这个主题的。
  • @FredrickGauss 你是对的。对不起,我好像忘记了我的礼貌。我一直在说它不是 C 而没有提供替代方案。是的,您应该使用*taa-&gt;a[i] 取消引用a[i]-&gt; 运算符的优先级高于 *,因此它等同于 *(taa-&gt;a[i]),这是我认为需要的。 -&gt;* 运算符用于 C++ 中的成员函数指针。这篇aristeia.com/Papers/DDJ_Oct_1999.pdf 文章应该举例说明-&gt;* 运算符在C++ 中的用途。
  • 我打算使用 *taa-&gt;a[i] 取消引用 a[i][0]taa-&gt;a[i][0] 以获取单个 character 访问权限。但是对于问题,它是字符数组的地址,所以简单地说taa-&gt;a[i]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多