C中字符串数组的增加值

时间:2018-06-19 18:35:52

标签: c pointers memory dynamic-memory-allocation

我有一个分配,其中我将字符串传递到定义为Traceback (most recent call last):` File "C:/Users/Soham Pal/Desktop/dec_to_octal.py", line 8, in <module> d=nthroot(c) NameError: name 'c' is not defined

的函数中

当传递的字符串指向char *get_word( char **string_ptr);字符时,我的main将停止调用该函数。因此,我必须在函数'\0'

中实现这一行

这让我很困惑。我的印象是*string_ptr += strlen( *string_ptr );是在函数中传递的字符串。那么,增加价值将意味着什么呢?

另一个问题。如果*string_ptr是一个字符串数组,那么**string_ptr或仅是*string_ptr本身是什么?

2 个答案:

答案 0 :(得分:3)

首先,join()从语义上不能保证**string_ptr将是字符串数组或char指针数组。处理内存管理后,这一点很明显。

据我所知,您正在向函数传递指向字符串的指针。 所以你要做类似的事情

string_ptr

要访问指针指向的字符串的值,请先取消引用指针,然后再取消引用字符串。这将解析为字符串的第一个字符。

char* string = "my string in read-only memory"; foo(&string); 是字符串的第一个字符。

**string_ptr是字符串

*string_ptr是指向字符串的指针。


有更清晰或至少更易理解的方式来实现您想要实现的目标:

string_ptr

您创建指向字符串的新指针

然后递增它,直到它指向包含char* p = *string_ptr; for(char* p = *string_ptr; *p != '\0' p++); 的地址


向变量添加更多\0只是意味着它指向另一件事。

*

以此类推


  

* string_ptr将是在函数中传递的字符串。那么,增加它的价值意味着什么?

您对此表示正确。 指针值的增加通常意味着对变量执行指针算术。从本质上讲,它与增加常规变量相同,但是这次是对一个地址值执行的,其中地址1的增加意味着char* ch; // ch points to char or string char** ch; // ch points to char* char*** ch; // ch points to char**

的增加

我演示了什么是增量指针及其作用。


1 * sizeof(type)

因为*string_ptr += strlen( *string_ptr );是字符串偏移量 这会使您的字符串指向其结尾。 因此,如果您在此之前获得更多参考,那就太好了。

答案 1 :(得分:1)

  

我有一个分配,其中我将字符串传递给函数   [原型] char *get_word( char **string_ptr);

     

我的主程序在传递字符串时将停止调用该函数   指向“ / 0”字符。

重要的是要区分 string pointer ,其中 string char的以空终止的 array 。到字符串的第一个字符,即如何将字符串传送到函数并从函数返回,以及通常通常如何访问字符串。指向字符串第一个字符的char *与字符串本身是独立的,并且独立于字符串本身。因此,您的陈述只有在被解释为“当传递了地址的指针变量的值指向字符串的'/ 0'字符时,我的main才会停止调用该函数。”

  

因此我必须实现这一行   在函数内部:*string_ptr += strlen( *string_ptr );

这确实会更新string_ptr指向的地址处的指针值,以使其指向它最初指向的字符串的终止符。但是,我倾向于这不是您真正想要的,因为那样就不需要多次调用该函数。如果函数无条件执行该语句,则传递的指针将仅在一次调用后始终指向终止符。

  

这让我很困惑。我的印象是   *string_ptr将是在函数中传递的字符串。那么,增加它的价值意味着什么?

*string_ptrstring_ptr指向的内容。使用您提供的声明,它将是类型char *的指针。请记住:区分此类指针和它所指向的东西(在这种情况下为字符串的第一个字符)非常重要。增加指针的值只会使其指向字符串中的后面某个字符(只要您不增加太多)。如果将其增加字符串中所有字符的数量,则它将指向终止符。

  

另一个问题。如果**string_ptr是一个字符串数组,那么   是*string_ptr还是仅凭string_ptr

被视为表达式,*string_ptr**string_ptr在上下文中毫无意义。但是,使用您提供的声明,表达式*string_ptr的计算结果为char *指向的string_ptr。表达式**string_ptr的计算结果为char所指向的char *所指向的string_ptrstring_ptr本身只是函数参数的值,该参数的值声明为指向char的指针。

但是我认为您实际上是在询问函数原型,在这种情况下,您提出了错误的问题。常见的问题是参数char **的类型(string_ptr)是否表示字符串数组。答案在几个级别上是“否”,而至少一个级别上是“也许”。

表面上,类型char **表示一个指向char的指针。此可以是指向char *数组中第一个char *的指针,如果您将这样的数组作为相应的参数出现,则将是这样。绝对不能确定指向的char *是数组的成员,如果是,则不会传送有关该数组长度的任何信息。指向单个标量char *的指针和指向char *的单成员数组的第一个也是唯一元素的指针之间没有有意义的区别。

当然,同一区别适用于下一级。有效的char * 经常指向字符串的第一个char,但是您不能单凭类型知道这一点。假设这样的指针是有效的,它可能指向char的无终止数组,或者指向单个标量char。特别是对于类型char *,它也可能指向任何其他类型的对象的值的原始字节。