警告:赋值从指针生成整数而没有强制转换,排序参数

时间:2017-03-09 19:06:51

标签: c arrays pointers

我知道有几次这样问过,但我仍然不完全理解这个问题。 我有一个分配,我需要保存和排序参数。

from bluepy import btle

class MyDelegate(btle.DefaultDelegate):
    def __init__(self):
        btle.DefaultDelegate.__init__(self)

    def handleNotification(self, cHandle, data):
        print("A notification was received: %s" %data)


p = btle.Peripheral(<MAC ADDRESS>, btle.ADDR_TYPE_RANDOM)
p.setDelegate( MyDelegate() )

# Setup to turn notifications on, e.g.
svc = p.getServiceByUUID( <UUID> )
ch = svc.getCharacteristics()[0]
print(ch.valHandle)

p.writeCharacteristic(ch.valHandle+1, "\x02\x00")

while True:
    if p.waitForNotifications(1.0):
        # handleNotification() was called
        continue

    print("Waiting...")
    # Perhaps do something else here

我知道这与我保存指向整数的指针或不执行它有关。

int main(int argc, char* argv[]) { int c; char* s = malloc(argc * sizeof(char)); extern char *optarg; extern int optind; extern int optopt; while ( (c = getopt(argc, argv, ":adh")) != -1) { s[argc] = argv; switch (c) { case 'a': printf("a\n"); break; case 'd': printf("d\n"); break; case 'h': printf("h\n"); break; } } return 0; } 是什么?一系列指针?
char* argv[]只是一组字符?

2 个答案:

答案 0 :(得分:0)

  

char* argv[]是什么?指针数组?

当这样的声明出现在函数原型中时,就像在代码中一样,它等同于char **argv。这是指向char指针的指针。在这种特殊情况下,指向指针是指针数组的第一个元素。

  

而s只是一个数组   字符?

当您声明已初始化它时,s是指向char的指针,特别是,它指向动态分配的块中的第一个char。您可以通过s使用该块,就像它是char的数组一样,但从技术上讲它不是一个数组,而s 肯定不是数组。虽然相关,指针和数组是非常不同的东西。

编译器应该至少告诉你错误发生在哪一行,但是你没有将这些信息传递给我们。不过,我想我可以猜到。这条线......

s[argc] = argv;

...是胡说八道。由于s是指向char的指针,s[argc]指定一个char(并且在C中,char是整数数据类型之一)。另一方面,argv是一个指针(指向char的指针)。虽然C允许将指针转换为整数,但这样做很少有用,而且无论如何,符合规范的程序必须使用强制转换来执行这种转换。由于您实际上并未使用s进行任何操作,因此您最好的选择可能就是删除该行。

对于它的价值,如果你想将s设置为指向其中一个命令行参数,比如说第二个,语法就是

s = argv[2];

argv的第0个元素通常是程序的名称;参数从索引1开始。)但如果您打算这样做,那么您不需要malloc() s的任何记忆;无论你为它分配什么都会在为它分配新值时泄露。

答案 1 :(得分:0)

char *argv[]是指向字符串数组的指针。 AKA char **argv
int argc是命令行上字符串数的整数计数,包括exe名称。

另请注意,argv[]中每个字符串的长度与argc的值无关。字符串可以短至两个字符,例如a\0或长度(或长于)1000个字符。

所以陈述char* s = malloc(argc * sizeof(char));不会做你认为会做的事 首先,它是一个表达式的形式,它只为一个字符串创建一些空间,而不是argc 其次,如果你的命令行包含3个项目(argc == 3),其中一个参数是一个长度为9的字符串,比如arguments,那么你的malloc语句将为1个字符串创建空格,只有3个字符。不足以包含字符串`arguments \ 0',更不用说其他两个了。

使用以下内容确定argc字符串中最长的字符串的长度:

int len = 0, lenKeep = 0;
for(i=0;i<argc;i++)
{
    len = strlen(argv[i] > len)
    if(len > lenKeep) lenKeep = len;
}

现在,lenKeep + 1已被确定为包含最长字符串所需的长度(NULL字符为+ 1,strlen(...)未包含在其计数中。)。这可以与知道字符串数argc一起使用,为每个字符串分配内存。

例如:

int main(int argc, char* argv[])
{
...
   char **string = Create2DStr(argc, lenKeep + 1);//will create space
                                                  //sufficient to contain
                                                  //strings of your command line
...
} 

Create2DStr(...)可以定义为:

char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen)
{
    int i;
    char **a = {0};
    a = calloc(numStrings, sizeof(char *));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(maxStrLen + 1, 1);
    }
    return a;
}