2017-01-02 97 views
0

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

指针数组

char *ptr[size + 1]; 

我由全局指针

char *p; 

我指出PTR(在相同的功能,PTR)

p = *ptr; 

然后我试图访问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();输出为:

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需要保持本地的功能。 (Im某些其他代码不会导致问题,并且ptr没有任何错误)

+1

'P = *的ptr;''解除引用和ptr'相同说'P = PTR [0];' – Goodies

+0

你可能意思是'p = ptr;' – Goodies

+0

你需要显示更多的代码。指针数组是静态的还是自动的?函数内部或函数返回后,显示的函数是否被调用?请创建一个MCVE([MCVE]) - 它不需要太多的代码,但这将提供关键的上下文,以便提供智能且有用的答案。 –

回答

3

ptr是一个指针数组。

char **p = ptr; 

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

'p'有什么用?为什么不简单地执行'char * str = ptr [n];'? – Lundin

+0

@Lundin我不知道,向OP询问。也许'p'是全局的,但不是'ptr'。这个答案只是一个简短的答案,并非详尽无遗,因为这个,我已经赞成了另外两个答案。 – Stargateur

+0

虽然这是点。 OP最有可能不应该有他们的“全局指针”开始。 – Lundin

2

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,这将有protoype:

void otherFunction(char** p); 

和你ptr叫它:

otherFunction(ptr); 
1

(0)怎么回事错在这里。 (1)我该如何修复它(2)还是有更好的方法来做到这一点

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

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

(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; 
} 
+0

“一般来说,指针指针的存在通常表明设计不佳。”,所以'int main(int,char **);'是一个糟糕的设计?这非常严格。除了那个,我完全同意你的答案。 3星程序员必须受到惩罚,我同意但是,两个开始?有很多情况下他们是有效的。 – Stargateur

+0

@ Stargateur'char ** argv'严格来说不是main的有效形式,当然'char * argv []'会衰减为指针指针,所以它们是等价的。两颗星的出现意味着你正在做一些不寻常的事情,比如通过参数返回一个指向malloc:ed数据的指针 - 这非常好。在其他情况下使用指针指针在我的经验中往往是程序员混淆的结果。例如错误地使用'char ** ptr = malloc(n * sizeof(* ptr)),'分配一个“2D数组”。 – Lundin

+0

但是,在动态分配指针数组时,使用指针指针会很好 - 尽管在这种情况下使用数组指针会更加正确。如果你真的知道你在做什么,指针指针就很好。 – Lundin