将数组与指针指向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 *
,它必须是分配内存上的有效指针。
那么,其他优势是什么?
答案 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>