首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >For循环未在c中终止

For循环未在c中终止
EN

Stack Overflow用户
提问于 2011-08-24 01:02:41
回答 3查看 613关注 0票数 9

我正在编写一些代码,并且收到一个奇怪的错误:当条件语句变为false时,我的for循环似乎不会退出。代码如下:

代码语言:javascript
复制
static void wstrcpy_from_Py_UNICODE(Py_UNICODE *inBuf, Py_ssize_t strLength, wchar_t **outBuf)
{
    if (strLength == 0) *outBuf = NULL;
    else
    {
        Py_ssize_t i;
        wprintf(L"String Length: %d\n", strLength);
        *outBuf = (wchar_t *)malloc (sizeof (wchar_t) * (strLength +1));
        for (i=0; i < strLength; i++)
        {
            wprintf("i:%d, strLength:%d\n", i, strLength);
            (*outBuf)[i] = (wchar_t)(inBuf[i]);
            wprintf(L"i < strLength: %d\n\n", i < strLength);
        }
    /* Make sure new string is zero terminated */
    (*outBuf)[i] = L'\0';
    }
}

当使用示例输入运行此代码时( Py_UNICODE * buffer指向使用u“example”创建的内部unicode python对象),我得到以下输出:

代码语言:javascript
复制
String Length: 7
i:0, strLength: 7
i < strLength: 1

i:1, strLength: 7
i < strLength: 1

i:2, strLength: 7
i < strLength: 1

i:3, strLength: 7
i < strLength: 1

i:4, strLength: 7
i < strLength: 1

i:5, strLength: 7
i < strLength: 1

i:6, strLength: 7
i < strLength: 1

i:7, strLength: 7
i < strLength: 1

i:8, strLength: 7
i < strLength: 1

...

直到运行代码的python解释器崩溃(我正在为python包装一个c模块),循环才会退出。

printf是用来调试的。

我是在Mac OSX 10.6上编译的,下面是我用来编译的命令:

代码语言:javascript
复制
gcc -c source.c -I/usr/include/python2.6 -I/usr/lib/python2.6
ld -bundle -flat_namespace -undefined suppress -o out.so source.o -F./ -framework some_framework -macosx_version_min 10.6 -rpath ./

正如您所看到的,我在为其制作python包装器的框架中进行了链接。这不是问题,因为我可以很好地调用使用链接框架的函数,只是当我调用使用上面显示的helper函数的函数时,我就会遇到问题。

是我很愚蠢,做了一些非常基本的错误,还是编译器出了什么问题?任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-24 01:16:30

我认为这很大程度上与数字精确度有关。如果Py_ssize_t是64位类型,它的形式可能是:0xffffffff00000008 (可能是因为之前的计算值涉及不正确的精度数字,或者混合了有符号计算和无符号计算)。当考虑为int (32位)时,它的结果是8,但当考虑为64位值时,它会产生一个非常小的负数(有符号)或一个非常大的正数(无符号)。尝试更改wprintf表达式以编写一个长十进制(%ld)并查看get打印的内容,或者使用gdb调试代码以查看实际大小的数字。

票数 14
EN

Stack Overflow用户

发布于 2011-08-24 01:15:41

您可以尝试使用int i和int strLength

我不知道Py_ssize_t类型,但是在printf中使用%d的隐式强制转换可能会隐藏这个问题

票数 5
EN

Stack Overflow用户

发布于 2011-08-24 01:16:12

什么是Py_ssize_t

代码语言:javascript
复制
printf("sizeof (int) is %d\n", (int)sizeof (int));
printf("sizeof (Py_ssize_t) is %d\n", (int)sizeof (Py_ssize_t));

除了使用char* (once)调用wprintf之外,还可以对Py_ssize_t类型的值使用"%d"说明符

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7164761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档