我知道有几次这样问过,但我仍然不完全理解这个问题。 我有一个分配,我需要保存和排序参数。
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[]
只是一组字符?
答案 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;
}