3

假设一个共享库包含以下行:

const char* const arr[] =
{
  "one",
  "two",
  "three"
};

1) 应用程序可以链接到这个库并使用符号“arr”吗?

2) 如果在定义中添加了一个新元素,二进制兼容性会被破坏吗?

3) 如果其中一个字符串文字被更改了怎么办?

4)为什么(不)?

干杯,卢克

4

4 回答 4

5

1) 是的

2) 没有

3) 没问题

4)为什么你会不这么认为?

于 2009-12-24T13:35:05.157 回答
5

在这两种情况下都不会破坏二进制兼容性。

C 风格的数组不会存储或假设数组的长度,因此增加数组的长度不会破坏任何假设。

您有一个指针数组,因此更改字符串文字根本不会影响数组的内存布局。

于 2009-12-24T13:37:52.207 回答
4

无论数组中有哪些元素,符号 arr 都指向数组的底部。您可以更改元素的数量或一个或多个元素的值,并且 arr 符号仍指向数组的开头。

然而,应用程序可能需要更多关于 arr 的信息:它可能想知道它有多少元素。

使用 NULL 指针终止列表,或导出大小:

const size_t arrSize = sizeof(arr)/sizeof(char*);
于 2009-12-24T13:40:15.447 回答
4

1) 是的,只要它声明了extern(请注意,const对象默认具有静态链接;是的,这是违反直觉的;))。

2) 取决于链接到它的代码如何使用此 arr。如果您希望新条目对外部代码有用,arr则应以 NULL 结尾,或者应带有extern const unsigned arr_size = sizeof(arr) / sizeof(arr[0]).

3) 没关系。数组本身由指向文字表示的指针组成;如果文字改变,数组本身的布局不会改变。

4)不,因为arr是指向文字表示的连续指针序列,仅此而已。

于 2009-12-24T13:44:09.323 回答