指向char或char数组的指针

时间:2018-03-28 01:35:15

标签: c arrays string pointers

将数组与指针指向char的好处是什么,如下面的结构所示​​:

struct my_struct {
   int p;
   char s[10];
};

struct my_struct {
   int p;
   const char *s;
};

我看到的一个优点是,char *更容易区分“没有提供字符串”和“提供空字符串”,它也比数组占用更少的空间。

此外,在这两种情况下我都可以初始化:

struct my_struct p { .p = 10, .s = "abcd" };

另一方面,我不能在strncpy()上轻松使用char *,它必须是分配内存上的有效指针。

那么,其他优势是什么?

3 个答案:

答案 0 :(得分:3)

优点和缺点取决于您的算法和您的身份 试图实现,没有简单的答案。可以这么说:

如果结构有char数组(这只是我的观点):

<强>优点

  • 您不需要为其分配内存,无需检查malloc是否失败 之后无需释放记忆

  • 易于使用fwrite / fread表示您的结构对象,无需照顾 在写入操作之前必须取消引用它的指针大小写/ 在读取操作之前分配内存。

  • 您可以使用字符串文字来初始化它,您可以更改内容 之后。

<强>缺点

  • 如果您需要存储字符串,则只有有限的空间 比阵列能容纳的时间长,那么你就麻烦了,可能不得不这么做 重新考虑你的设计。

如果结构有char指针:

<强>优点

  • 您可以更自由地使用指针,可以分配和重新分配 记忆取决于您的需求。

  • 您可以指定指针指向其他char数组,而无需使用 分配

  • 您的结构尺寸较小,需要较少的内存。你很棒 不会为您的结构动态分配内存。

<强>缺点

  • 您需要自己进行内存管理,具体取决于您的设计 消耗大量时间直到你做对了

  • 如果您计划将对象发送/写入网络或硬盘驱动器,则需要执行此操作 注意取消引用指针,你不能fwrite(obj, n, sizeof *obj, fp), 你需要做很多步骤。

  • 如果指定字符串文字,则必须注意以后不要修改它 上。修改字符串文字是未定义的行为,在大多数系统中你都是 立刻得到一个段落。

一般来说,考虑一下您自己软件的设计以及您的需求, 那么你可以权衡利弊,并使用最适合你的那个 项目

  

我无法在strncpy()上轻松使用char*,它必须是已分配内存的有效指针。

只有部分正确,一旦分配了内存,可以使用 strncpy

  

此外,在这两种情况下我都可以初始化:

struct my_struct p { .p = 10, .s = "abcd" };

是的,但是在数组的情况下,数组中填充了内容 字符串文字,可以在以后修改。在指针的情况下,它将指向字符串文字和 就像我之前说过的,如果你的算法需要修改内容,那么你 不能使用字符串文字。

答案 1 :(得分:1)

  

它也比阵列占用更少的空间。

它没有,因为无论如何你必须指向一些数据。假设你指向一个相同大小的缓冲区,你最终会得到sizeof(void *) + sizeof(char [10])

  

此外,在这两种情况下我都可以初始化:

struct my_struct p { .p = 10, .s = "abcd" };

是的,因为编译器正在内存中设置文字字符串并将s成员指向它。在这种情况下,您总共使用sizeof(void *) + sizeof(char [5])个字节。

  

我不能在char *上轻松使用strncpy(),它必须是分配内存上的有效指针。

不,你可以在两种情况下使用strncpy()

关于你应该使用什么:选择不是优点和缺点。相反,你应该使用你需要的任何东西。例如,如果您事先并不知道数组的最大大小,那么您别无选择,只能选择指针方法。如果你知道,那么你可以使用这两种方法;但阵列一维将更容易维护。

性能考虑因素也会影响您的决策。例如,假设您对struct的许多实例进行操作,则取决于您访问struct的方式以及用于保存实例的数据结构类型,即访问模式数据。很多时候,嵌入式阵列更快,但并非总是如此。

答案 2 :(得分:1)

让我试着解释一下:

阵列使用起来更简单,但难以操作。

指针可以轻松释放已经为char*分配的空间并分配新空间,从而具有更大的灵活性。让我们看一个例子:

int cnt = 0; // holds number of characters enterd
char c = 0;
while (cnt != -1) {
  printf("Enter number of characters in next word: ");
  cnt = getint();
  printf("Enter the word: ");
  char *word = malloc((cnt + 1) * sizeof(char));
  int i = 0;
  char c = 0;
  for (;i < cnt; ++i) {
     *(word + i) = c; // *(word + i) is technically the same as word[i]
  }   
  *(word + i) = '\0';
  free (word);
} 

您可以在上面的示例中看到,您可以在给定时间分配尽可能多的空间,而无法使用数组。

因此,如果您正在制作英语词典,使用数组,即使平均字长为5,6个字符,您也需要立即分配45个字符。

将其应用于您的案例

struct my_struct {
  int p;
  char s[10];
};

最多需要10个字符,这些字符在程序开头分配。如果输入2个字符,则基本上会浪费8个字符。

中的位置
struct my_struct {
  int p;
  char *s;
};

你可以调用malloc()你可以分配1个字符,它可以容纳1个字符,没有浪费的空间,你可以分配100个字符,它将保持100个。所有这些都是动态的。< / p>