将取消引用的指针的地址传递给字符串偏移量

时间:2019-03-09 10:43:03

标签: c algorithm pointers pointer-arithmetic

假设有这样的功能

int foo (char** str, int x)
{
    char* p = *str + x;

    foo2(&p); // declared as int foo2 (char** );
}

(当然,过于简化了,实函数是递归的,而且要复杂得多)


我试图这样做:

int foo (char** str, int x)
{    
    foo2(&(*str + x));
}

但是编译器失败并出现错误:

  

错误:左值必须为一元'&'操作数

为什么编译器会因该错误而失败,如何在不声明变量和使用其自身地址的情况下将指针传递给指向字符串x字节的指针?


编辑

似乎有一些误解,所以我将发布一个完整的模拟,以模拟我想要实现的目标。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* string = "This is a sample string.";
char* ptr;
int randomizer;

int receive_string (char* buffer, int size) // recv
{
    int i = 0;

    if(ptr == NULL)
        ptr = string;

    for(i = 0; *ptr != '\0' && i < size; ptr++)
    {
        if(randomizer == 2)
        {
            randomizer++;

            break;
        }

        buffer[i] = *ptr;

        i++;

        randomizer++;
    }

    if(*ptr == '\0')
    {
        buffer[i] = *ptr;

        i++;
    }

    return i;
}

int read_string (char* *buffer, int size, int alloc)
{
    int bytes = 0;

    printf("Reading string..\n");

    if(*buffer == NULL && alloc == 1)
    {
        printf("Allocating buffer..\n");

        *buffer = calloc(size, sizeof(char));
    }

    bytes = receive_string(*buffer, size);

    if(bytes == (-1))
    {
        return(-1);
    }
    if(bytes == 0)
    {    
        return 0;
    }
    if(bytes < size)
    {
        char* p = *buffer + bytes;
        //int temp = read_string(&p, size - bytes, 0); // works
        //int temp = read_string(&(char *){&(*buffer)[bytes]}, size - bytes, 0); // works
        int temp = read_string(buffer + bytes, size - bytes, 0); // doesn't work

        if(temp > 0)
            bytes += temp;
        else return bytes;
    }

    return bytes;
}

int main()
{
    char* buffer = NULL;

    int bytes = read_string(&buffer, strlen(string) + 1, 1);

    printf("[%u][%s]\n", bytes, buffer);

    if(buffer)
        free(buffer);

    return 0;
}

randomizer是最笨拙的“模拟”不能接收所有字节的recv()的快捷方式。此实现模拟recv(),但不是从套接字队列读取而是从全局字符串读取。

3 个答案:

答案 0 :(得分:3)

(*str + x)不是左值,因为它是一个没有地址的临时值,因此您不能使用&来获取其地址。即使编译器将该值存储在RAM中的一个临时变量中,以便可以获取其地址,如果foo2()修改了temporay变量的内容,那么您以后如何引用它的值。

因此,您需要自己将值存储在一个临时变量中。

答案 1 :(得分:0)

如果要将指针传递给指向特定字符的指针

foo2(&(char *){&(*str)[x]});

答案 2 :(得分:0)

我认为以下代码是您要尝试执行的操作。对于踢,我使它递归并用字母测试字符串。变量cnt和lmt必须是全局的。如果您运行它,它将显示一个收缩的字符串。只需确保将p和lmt保持足够小,以免字符串溢出。

SELECT `fldCompName`, `fldName`, `fldResult`  
FROM `tblMembEntComp`  
JOIN `tblCompetition` ON `tblMembEntComp`.`fldCompID`=`tblCompetition`.`fldCompID`
-- EXAMPLE
AND `tblCompetition`.`fldCompID` = {someX}
------ 
JOIN `tblImage` ON tblMembEntComp`.`fldMemberID`=`tblImage`.`fldMemberID` 
ORDER BY `fldResult` DESC LIMIT 3";