指向本地指针数组的全局指针

我在一个函数中有一个指向数组的指针数组。 我需要在另一个函数中访问该数组。

指针数组

char *ptr[size + 1]; 

我做了一个全局指针

 char *p; 

我指向ptr(与ptrfunction相同)

 p = *ptr; 

然后我试图从其他function访问ptr

 void otherFunction(void){ for(int n = 0; n < 6; n++) { char* str = &p[n]; printf("%i %s\n", n, str); } } 

什么时候

 ptr[0] = "abcd" ptr[1] = "bcde" ptr[2] = "cdef" ptr[3] = "defg" ptr[4] = "efgh" ptr[5] = "fghi" 

otherfunction();的输出otherfunction(); 是:

 0 abcd 1 bcd 2 cd 3 d 4 5 

我想要输出

  0 abcd 1 bcde 2 cdef 3 defg 4 efgh 5 fghi 

我的问题是:(0)这里出了什么问题。 (1)我如何解决它(2)或者有更好的方法来做到这一点。 要求是otherfunction()不能采取任何参数和ptr需要保持其function的本地。 (我确定其他代码没有导致问题,并且ptr没有任何问题)

ptr是一个指针数组。

 char **p = ptr; char *str = p[n]; printf("%i %s\n", n, str); 

char *ptr[size + 1];

char* p = *ptr;

char* str = &p[n];

这使得p指向字符串的ptr数组的第一个字符串,然后str将逐个字符地迭代该字符串。 我认为你的意思是:

 char** p = ptr; // p points to the first string of ptr ... char* str = p[n]; // str points to the nth string of ptr 

除此之外,使用全局指针并不是一个好主意。 可能更好的是将ptr本身传递给函数otherFunction ,它将具有原型:

 void otherFunction(char** p); 

你用ptr调用它:

 otherFunction(ptr); 

(0)这里出了什么问题。 (1)我如何解决它(2)或者有更好的方法来做到这一点

(0)整个程序设计。 使用像这样的全局变量 – 特别是指针 – 是意大利面条编程的一种forms,应该避免使用。 您正在程序中创建各种不相关部分之间的紧密耦合和依赖关系。

通常,指针指针的存在通常表示设计不佳。 对于特殊情况,例如通过函数参数返回修改的指针,指针指针有一些有效的用途。 没有明显的理由在你的情况下使用它们。

(1)通过使用几个类型限定符和存储说明符来减少那些混乱的全局变量的范围。 而是通过setter / getter函数访问指针数组。

(2)是的,将程序更改为类似下面的代码:

 static const char* ptr [] = { "abcd", "bcde", "cdef", "defg", "efgh", "fghi", NULL }; inline const char* get_str (size_t index) { return ptr[index]; } inline void set_str (size_t index, const char* str) { ptr[index] = str; }